2016-06-21 3 views
0

Я пытаюсь передать указатель указателя, чтобы изменить его содержимое в другой функции. Для того, чтобы сделать это, я прочитал, что мне нужно использовать указатель указатель указатель, так вот мой «код» до сих пор:Несовместимый тип указателя при передаче указателя указателя

void modify(s8 ***strings){ 
    // Modifies the strings 
} 

void main(){ 
    s8 strings[9][95]; 
    for(i = 0 ; i < 9 ; i++){ 
     for(j = 0 ; i < 95 ; i++){ 
      strings[i][j] = 0; 
     } 
    } 
    modify(&strings); 
} 

s8 представляет собой особый тип, который используется MicroBlaze I» м, это проблема? Я также прочитал, что мне нужно использовать const, но я не понимаю, где и почему?

Как насчет размера? Нужно ли использовать внутреннюю модификацию malloc, чтобы зарезервировать место в памяти? Или же можно просто установить функцию изменения как:

void modify(s8 *strings[9][95]) 

Сейчас мой вопрос заключается в следующем: я получаю предупреждение в последней строке (изменить (& строк)) о типе указателя, который неверен.

passing argument 1 of 'modify' from incompatible pointer type 

Спасибо за ваши ответы!

ответ

5

Прежде всего an array of arrays is not the same as a pointer to a pointer.

Во-вторых, если вы хотите изменить строки в массиве, вам не нужно эмулировать передачу по ссылке, передав указатель на strings. Все, что вам нужно передать его как нормальный аргумент, и, конечно, изменить функцию подходяще:

void modify(s8 strings[][95]){ 
    ... 
} 

int main(void){ 
    s8 strings[9][95]; 
    ... 
    modify(strings); 
    ... 
} 

В функции modify вы объявляете strings быть указателем на массив символов 95. Затем, когда вы передаете strings из функции main, он распадается на указатель на свой первый элемент, который является указателем на массив из 95 символов.

Если вы хотите более подробно указать аргумент strings в указателе modify, вы можете сделать это, например.

void modify(s8 (*strings)[95]){ 
    ... 
} 
+0

Спасибо за ваш ответ, передавая массив как нормальный аргумент является то, что я сделал первый, но тогда мой вопрос заключается в том, что последний элемент (строки [7]) не то, что я поставил в функции изменить как только я вернусь к основной функции. Вот почему я думал, что пытаюсь сделать это неправильно. Вы знаете, почему? Тем временем я попробую ваш синтаксис, чтобы узнать, есть ли у меня эта проблема! –

+1

@ArthurPenguin Похоже, что у вас есть ошибка внутри функции, которая, возможно, не связана с передачей параметров. – Lundin

+1

В качестве альтернативы используйте VLA: 'void modify (size_t x, size_t y, s8 строки [x] [y])'. – Lundin

Смежные вопросы