الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مصفوفة ديناميكية لا تغير قيمها

مغلق
بدأه abomedian في 12 يونيو 2006 · 5 رد · 702 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع
function func(po:pointer):boolean;
var 
Da: array of byte;
begin
setLength(da,sizeof(po));
 here is my problem {1}
.........
.............
Statements ......what ever

end;

اريد استدعاء الدالة السابقة على الشكل

vaR 
bVal:boolean;
sec:array [0..131072] of byte;
begin
bval:=func(@sec);
end;

المشكلة في الرقم 1 اريد وضع المصفوفة المرسلة على شكل مؤشر في المصفوفة الديناميكية

و هذه التوابع التي جربتها

i used API Func :

MoveMemory

FillMemory

ZeroMemory

copymemory

and i tryed

move

copy

but all failed

what to do professionals

help me .......................................AboMedian

_________________________________________________

تنبيه: الكتابه بالحجم الكبير في كل النص كأنك تصرخ بأعلى صوتك في أذن القارئ للمشاركة!

وإستعمال التنسيق المناسب للخط سيزيد من مقروئية المشاركة ووضوحها.

تم تعديل هذه المشاركة بواسطة ikossan في 12 يونيو 2006 في 23:51

#2

الخطأ يكمن في هذه العبارة

setLength(da,sizeof(po));

لأن sizeof(po) سترجع دائما القيمة 4 مهما كان نوع المؤشر PO.

نفذ هذا السطر لتتأكد, وعرف مسبقا po كما تشاء من أصناف المؤشرات:

   ShowMessage(' size of the pointer po= $'+IntToHex(Dword(po),2) + ' is: ' + 
IntToStr(SizeOf(po)));

هذا لأن مفهوم المؤشر هو عنوان في الذاكرة و بما أنك تستعمل win32 فكل العناوين هي من 32Bits أي 4 بايتات. والدالة sizeof تقوم بإعادة عدد البايتات اللازمة لكل نوع من أنواع المتغيرات, والبوانتر معرفة كلها على انها cardinal أي dword.

بالنسبة للدالة func فيجب أن تعدلها إلى:

function func(po:pointer;len: integer):boolean;
var
Da: array of byte;
begin
setLength(da,len));
.........
.............
end;

لكي تأخذ بعين الإعتبار حجم البيانات التي تمرر لها.

وتستتدعيها على هذا النحو:

bval:=func(@sec,sizeof(sec));

تم تعديل هذه المشاركة بواسطة ikossan في 13 يونيو 2006 في 00:16

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#3

اعتقد ان الحل غير كافي السبب انني اريد تغير طول المصفوفة الى عدد قد يصل طوله الى 103172 بايت و الدالة sizeof ستعيد الربة دائماً لذلك انا بحاجة الى طريقة لادخال متتويات PO في المصفوفة الديناميكية على اعتبار ان المرسل الى المؤشر مصفوفة طوله قد يتغير من مرة الى اخرى

على كل حال شكراً لك و اذا لم اكن قادرا على التوضيح ساعيد السؤال بطريقة الخرى

#4

اوضح اكثر ما تريد

ليتمكن الشباب من مساعدتك

قطرة الماء تـثـقب الحجر.. لا بالعنف. لكن بتكرار المحاولة

at4re.gif

منتديات الفريق العربي للهندسة العكسية 不喜欢的勿入! www.at4re.com

#5

لماذا لا تقوم المصفوفة الديناميكية بتغيير قيمها عند استتخدامها مع تابع الAPI

ReadFile

في نظام اكس بي أو عند تمريرها كوسيط دالة مثلاً الدالة:

function fofo(a:pointer):boolean

و يكون التمرير :

var

a: array of byte

begin

fofo(a) end

وطبعا قمت باستخدام SetLength

بس ما مشي الحال

يللي ما فهم بعتذر بس يللي عندو أي مواضيع عن مصفوفات ديناميكية مستخدمة مع API

و شكراً

#6

في الحقيقة لم تقم بتوضيح ما تريده أبدا, بل كان سؤالك موجه إلى ناحية مغايرة

فبعد قراءة الكود أعتقد أن ما تريده هو تمرير مصفوفة إلى تابع والقدرة على الكتابة فيها أليس كذلك؟

أولا بالنسبة لتمرير المصفوفات في توابع API وغيرها فيكون ذلك عن طريق تمرير مؤشر البداية لهذه المصفوفة وطول هذه المصفوفة

ثانيا لا يتم التعامل مع المصفوفة التي تم تمرير مؤشر بدايتها بأن تقوم داخل الإجراء بإنشاء مصفوفة ديناميكية بطول المصفوفة الممررة فذلك يعني أنك تعمل على مصفوفة جديدة لا علاقة لها بالمصفوفة الممررة

أخيرا وقبل أن أقوم بوضع أي أمثلة أحتاج لأن أعرف إن كان هذا ما تريده وتوضح مشكلتك

هذا الموضوع مغلق.

مواضيع مشابهة