PDA

View Full Version : خواندن بخشی از حافظه و تغییر آدرس متغیرها



MEhdi Sobhani
چهارشنبه 17 شهریور 1389, 18:32 عصر
سلام
لطفا راهنمایی کنید که در سی شارپ چطور میشه بخشی از حافظه رو خوند و به متغیر دیگه ای منتقل کرد مثلا آرایه ای از بایت و یا اینکه کلا بشه اون آدس رو به متغیر دیگه ای نسبت داد .
مثلا آدرس یک آرایه از بایتها رو به یک متغیر دابل نسبت بدیم و یا آدرس آرایه بایت رو به یک استراکچر ساده نسبت بدیم یا به رشته و . . . ؟
با تشکر فراوان .

Saman_12
چهارشنبه 17 شهریور 1389, 20:16 عصر
سلام.
من منظورتون رو درست نفهمید.(مثلا شما یک متغییر int تعریف کاردی حالا می خوای اونو به یک متغییر String نصبت بدید و اونو با مسیج نشون بدید این جوریه یا من اشتباه فهمیدم؟)

MEhdi Sobhani
چهارشنبه 17 شهریور 1389, 20:24 عصر
سلام.
من منظورتون رو درست نفهمید.(مثلا شما یک متغییر int تعریف کاردی حالا می خوای اونو به یک متغییر String نصبت بدید و اونو با مسیج نشون بدید این جوریه یا من اشتباه فهمیدم؟)
سلام
ممنون از اینکه توجه کردید .
نه منظورم این نیست
مثلا من یک متغیر string تعریف کردم که 8 بایت داره .
حالا آدرس این متغیر استرینگ رو بدست میارم .
یه متغیر دابل هم که 8 بایت داره تعریف میکنم .
حالا هر کدوم از این متغیر ها یه آدرسی در حافظه دارند .
میخوام مثلا متغیر دابل بیاد و آدرسش در حافظه تغییر بکنه و بشه آدرس متغیر رشته ای و در نتیجه مقدار دابل متناظر با اون 8 بایت رشته رو به دابل برگردونه .

خیلی کارهای دیگه هم میشه کرد با این .

مثلا در مورد آرایه ها . یه آرایه بایت رو از فایل بخونیم و بعد با استفاده از محل شروع آدرسش اون رو به متغیرهای مختلف مثلا رشته , int , long و ... نسبت بدیم .

یعنی اینطوری هیچ کاری به نوع متغیرها نداریم و فقط میگیم کدوم قسمت حافظه به هر متغیر اختصاص پیدا کنه .

fjm11100
پنج شنبه 18 شهریور 1389, 11:44 صبح
با استفاده از pointer
البته استفاده از آن خطرناک است (باید بدونی دقیقا داری چیکار میکنی چون خطاهای منطقی عجیب و غریبی مثل دام توی راهته) و باید آنرا درون یک بلوک unsafe قرار داده و گزینه unsafe را برای کامپایل فعال کرده باشیم.

MEhdi Sobhani
پنج شنبه 18 شهریور 1389, 12:12 عصر
با استفاده از pointer
البته استفاده از آن خطرناک است (باید بدونی دقیقا داری چیکار میکنی چون خطاهای منطقی عجیب و غریبی مثل دام توی راهته) و باید آنرا درون یک بلوک unsafe قرار داده و گزینه unsafe را برای کامپایل فعال کرده باشیم.
سلام ممنون
میشه مثال بزنید .
مثلا یه کاری مثل پست بالا
با پوینتر فقط میتونم آدرس رو داشته باشم اما نمیتونم تغیرش بدم و مثلا آدرس دو تا متغیر رو با هم عوض کنم .

fjm11100
یک شنبه 21 شهریور 1389, 10:12 صبح
آدرس را نمی تونی عوض کنی اما مقادیر را می تونی عوض کنی. کلا آدرس در هنگام تعریف یک متغیر اختصاص داده میشه و تا متغیر پاک نشه آدرسش ثابت میمونه. بگو میخوای چیکار کنی تا راه حلی اگر داشتم ارائه بدم

FastCode
یک شنبه 21 شهریور 1389, 16:59 عصر
یک متغیر string این ساختار رو داره:
4 byte lock
4 byte reference count
اینجا pointer ی هست که شما داری.
4 byte character count
اینجا اون هشت بایت شما شروع میشه.

MEhdi Sobhani
چهارشنبه 14 مهر 1389, 20:46 عصر
آدرس را نمی تونی عوض کنی اما مقادیر را می تونی عوض کنی. کلا آدرس در هنگام تعریف یک متغیر اختصاص داده میشه و تا متغیر پاک نشه آدرسش ثابت میمونه. بگو میخوای چیکار کنی تا راه حلی اگر داشتم ارائه بدم


یک متغیر string این ساختار رو داره:
4 byte lock
4 byte reference count
اینجا pointer ی هست که شما داری.
4 byte character count
اینجا اون هشت بایت شما شروع میشه.
سلام
شرمنده یه مقدار دیر جواب دادم .
کاری که میخوام بکنم اینه که مثلا یه فایل دارم که 100 کیلوبایت اطلاعات داره .
حالا تمام این اطلاعات رو میخونم داخل یه آرایه بایت .
حالا مثلا میخوام از بایت 45 تا 65 بشه یه رشته و 65 تا 69 یه عدد صحیح .
مثلا آدرس بایت 65 رو به دست بیارم و بعد آدرس یه متغیر int32 رو برابر اون آدرس قرار بدم .

میلاد قاضی پور
چهارشنبه 14 مهر 1389, 21:00 عصر
ببینید من فکر میکنم شما نیازی به داشتن آدرس ندارید و طبق برداشت من کار شما ربطی به استفاده از آدرس متغیر ها در حافظه و اشاره گر ها نداره اما یه نقل قول از کتاب سی شارپ 2008 رو عینا بدون هیچ حرف اضافی دیگه ای براتون ارائه میکنم که مطمئنم به دردتون خواهد خورد :



Pointer Syntax
Once you have marked a block of code as unsafe , you can declare a pointer using this syntax:




int* pWidth, pHeight;
double* pResult;
byte*[] pFlags;

This code declares four variables: pWidth and pHeight are pointers to integers, pResult is a pointer to
a double , and pFlags is an array of pointers to bytes. It is common practice to use the prefix p in front
of names of pointer variables to indicate that they are pointers. When used in a variable declaration, the
symbol * indicates that you are declaring a pointer (that is, something that stores the address of a
variable of the specified type).
C++ developers should be aware of the syntax difference between C++ and C#. The C# statement int*
pX, pY; corresponds to the C++ statement int *pX, *pY; . In C#, the * symbol is associated with
the type rather than the variable name.
Once you have declared variables of pointer types, you can use them in the same way as normal
variables, but first you need to learn two more operators:
❑ & means take the address of , and converts a value data type to a pointer, for example int to *int .
This operator is known as the address operator .
❑ * means get the contents of this address , and converts a pointer to a value data type (for example,
*float to float ). This operator is known as the indirection operator (or sometimes as the dereference
operator ).
You will see from these definitions that & and * have opposite effects.
You might be wondering how it is possible to use the symbols & and * in this manner because these symbols
also refer to the operators of bitwise AND ( & ) and multiplication ( * ). Actually, it is always possible
for both you and the compiler to know what is meant in each case because with the new pointer
342
Part I: The C# Language
meanings, these symbols always appear as unary operators — they act on only one variable and appear
in front of that variable in your code. By contrast, bitwise AND and multiplication are binary operators —
they require two operands.
The following code shows examples of how to use these operators:



int x = 10;
int* pX, pY;
pX = & x;
pY = pX;
*pY = 20;

میلاد قاضی پور
چهارشنبه 14 مهر 1389, 21:04 عصر
حالا تمام این اطلاعات رو میخونم داخل یه آرایه بایت .
تا اونجایی که من میدونم آرایه یک آدرس داره و شما نمیتونید به آدرس تک تک آیتمهاش دسترسی داشته باشید چون مشکلات بعدی در اونصورت ممکن بود پیش بیاد بنابراین این امکان وجود نداره .