سؤال

لدي مؤشر لمجموعة المؤشر.أقوم بتعيين كل صف في الحلقة بينما تظهر الطباعة داخل الحلقة بينما تم تعيين رقم التعريف الخاص بي لكل صف من 1 إلى 20.
بعد ذلك، خارج الحلقة أثناء التكرار عبر المصفوفة ويتم كتابة كل عنصر بالمعرف 20؟
أي مساعدة يحظى بتقدير كبير.(لمعلوماتك- أنا أستخدم مكتبة Template2doc وexample1.c، في الأسفل هنا- http://www.algonet.se/~thunberg/template2doc/c_version/docs/index.htm)

الكود أدناه يظهر منطقة المشكلة فقط، وأخرجت الباقي.

    char **tableData[500]={NULL};         
    char *myData[500][2]; 


while(rc == SQLITE_ROW){
    tableData[r] = myData[r];
    printf(*tableData[r]); <-- Displays id 1-20 fine
    r=r+1;
}//end while 

tableData[r+1] = NULL;//null terminated array

for (a=0; a<r; a++){
    printf("\n");
    printf(*tableData[a]);  <--Displays 20 elements all of id 20?
}


outputFile=insertTableData(outputFile, dataMarker, fieldMarker, tableData);
هل كانت مفيدة؟

المحلول

يجب عليك إنشاء شيء يقوم بالفعل بتجميع المشكلة وإعادة إنتاجها.لن يساعد ذلك الأشخاص على مساعدتك فحسب، بل قد تجد المشكلة بنفسك من خلال القيام بذلك.

في مقتطفات التعليمات البرمجية الخاصة بك ليس لدينا أي فكرة:

  • ما هو rc، وكيف يتم تعيين قيمته، أو كيف ستتغير قيمته، وبالتالي إنهاء الحلقة
  • ما هي القيمة الأولية ل r
  • ما هي المحتويات الفعلية لـ myData

لقد قمت بإنشاء هذا الكود بناءً على ما قمت بنشره، والذي ينتج نفس الناتج من كلتا الحلقتين.لذا إما أنني فاتني شيئًا ما فيما قمت بنشره، أو أنك تركت شيئًا مهمًا.

int main( int argc, char** argv ) {

#define STRING  char *

STRING  dummy = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()";

STRING *tableData[500]={0};         
STRING myData[500][2];

int r=0;

while(r < 20){
        myData[r][0] = dummy+2*r;
        myData[r][1] = dummy+r;
        tableData[r] = myData[r];
        printf(*tableData[r]);
        printf("\n");
        r=r+1;
}//end while 

int a;

for (a=0; a<r; a++){
        printf(*tableData[a]);
        printf("\n");
}


}

نصائح أخرى

وكما أشار، قمت بتعيين لاغية في ص + 2 موقف. وأنت في أي طريقة تعديل tableData أو myData بين حين وللحلقة؟

وكيف حالك ملء myData؟ أنا لا أرى خلل واضح في المثال رمز معين، ولكن أظن أن المشكلة تكمن في أن قمت بتعيين مؤشر إلى المخزن مؤقت في myData دون نسخ الواقع المحتويات، بحيث myData [0 .. ص] كل نقطة ل المخزن نفسه، والذي سيتم تخزين فقط قيمة أحدث قراءة. جرب هذا:

while(rc == SQLITE_ROW){
        tableData[r] = myData[r];
        if (r > 0)
            printf(*tableData[r-1]);
        r=r+1;
}//end while 

وهذا يجب طباعة هويات 1-19 غرامة. إذا كان يبدأ في معرف 2 بدلا من معرف 1، التي تشير إلى myData لا حفظ نسخة من البيانات، كل شيء مشيرا في نفس الموقع.

وكذلك من ما أستطيع أن أرى الآن، كنت إنهاء tableData بك في الأساس ص + 2 من هاتفك الماضي "ثنائي" من المعلومات. أيضا، قد تكون أكثر وضوحا قليلا (ربما فقط بالنسبة لي) إذا فعلت tableData [0] [1] أو tableData [0] [2] عندما printf'ing. هذا النوع من يجعل الأمر أكثر وضوحا أن tableData هو مؤشر على "هيكل" 2، يحتوي كل منها على NULL إنهاء السلسلة. قد تساعد مع التصحيح وكذلك ...

وهذه محاولة لتصحيح الأخطاء ثم:

printf("Character at 0x%x : %d", tableData[a], *tableData[a]);

قد يكون علة في ما كنت أخرج؟

نعم، كان هناك كل لافتا إلى القيمة الأخيرة عرج به. ذهبت إلى الأمام وتخصيص مساحة الذاكرة لكل عنصر، لافتا إلى كل وفقا لذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top