Массив поверх записанного с последним назначенным значением? - PullRequest
3 голосов
/ 07 января 2009

У меня есть указатель на массив указателей. Я присваиваю каждую строку в цикле while, указанном ниже, и printf внутри цикла while показывает, что каждой из них присвоен мой идентификатор 1-20. После, вне цикла while я перебираю массив, и каждый элемент записывается с идентификатором 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);

Ответы [ 6 ]

2 голосов
/ 09 января 2009

Вы должны создать что-то, что на самом деле компилирует и воспроизводит проблему. Это не только поможет людям помочь вам, но при этом вы вполне можете сами найти проблему.

В вашем фрагменте кода мы понятия не имеем:

  • Что такое 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 голосов
/ 09 января 2009

Как вы заполняете myData? Я не вижу явной ошибки в приведенном примере кода, но я подозреваю, что проблема заключается в том, что вы назначаете указатель на буфер в myData без фактического копирования содержимого, поэтому все myData [0 .. r] указывают на тот же буфер, в котором будут храниться только самые последние прочитанные значения. Попробуйте это:

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 не хранит копию данных, все указывает на одно и то же местоположение.

2 голосов
/ 08 января 2009

Как указывалось, вы присваиваете Null в позиции r + 2. И вы каким-либо образом изменяете tableData или myData между циклом while и for?

1 голос
/ 09 января 2009

Попробуйте для отладки:

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

Может быть ошибка в том, что вы вынули?

1 голос
/ 08 января 2009

Итак, из того, что я вижу сейчас, вы заканчиваете свои tableData, по существу, на r + 2 от вашего последнего "дублирования" информации. Кроме того, это может быть немного понятнее (может быть, только для меня), если вы сделали tableData [0] [1] или tableData [0] [2] при печати. Этот вид делает более ясным, что tableData является индексом для «структуры» из 2, каждый из которых содержит завершенную строку NULL. Это также может помочь с вашей отладкой ...

0 голосов
/ 12 января 2009

Да, все указывало на последнее значение. Я пошел дальше и выделил место для памяти для каждого элемента, указав соответственно на каждый элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...