2016-03-03 2 views
-3

Я использую ANSI C 89. Я хотел бы написать функцию, которая принимает двумерный массив в качестве параметра и изменяет его. Возможно, без использования структур или указателей. Мой код:Как изменить массив с помощью функции C

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define level 0 
#define elements 1 

void merge(int state[30][2]){ 
    int index_state = 0; 
    int array[30][2]; 
    int index_array = 0; 
    memset (array, -1, sizeof(array)); 
    for (index_state = 0; state[index_state][level] != -1; index_state++){ 
    if (state[index_state][level] != 4){ 
     if (index_state == 0){ 
     array[0][level] = state[index_state][level]; 
     array[0][elements] = state[index_state][elements]; 
     } 
     else { 
     if (state[index_state][level] == array[index_array][level]){ 
      array[index_array][elements] += state[index_state][elements]; 
     } 
     else{ 
      index_array++; 
      array[index_array][level] = state[index_state][level]; 
      array[index_array][elements] = state[index_state][elements]; 
     }  
    } 
    } 
} 
state = array; 
int i = 0; 

printf("-----\nPrint values array inside function merge\n------\n"); 

for (i = 0; array[i][level] != -1 ; i++){ 
    printf("Level merge[%d]: %d, elements merge[%d]: %d.\n", i, array[i][level], i, array[i][elements]); 
} 

printf("-----\nPrint values state inside function merge\n------\n"); 

for (i = 0; state[i][level] != -1 ; i++){ 
    printf("Level merge[%d]: %d, elements merge[%d]: %d.\n", i, state[i][level], i, state[i][elements]); 
} 
} 

int main(void) { 
    int start_state[30][2] = {{0,4},{1,4},{2,32},{2,32},{4,64},{3,64},{2,64},{1,8},{2,8},{3,48},{4,64},{3,64},{2,4},{3,4},{4,12},{3,12},{2,16},{1,8},{-1,-1}}; 
    int i = 0; 
    printf("-----\nPrint start_state.\n-----\n"); 
    for (i = 0; start_state[i][level] != -1; i++){ 
    printf("start_state[%d][level] = %d, start_state[%d][elements] = %d.\n",i,start_state[i][level],i,start_state[i][elements]); 
    } 
    merge (start_state); 
    printf("-----\nPrint the merged start_state.\n-----\n"); 
    for (i = 0; start_state[i][level] != -1; i++){ 
    printf("start_state[%d][level] = %d, start_state[%d][elements] = %d.\n",i,start_state[i][level],i,start_state[i][elements]); 
    } 
    return EXIT_SUCCESS; 
} 

Функция принимает входные данные правильно и делает то, что я хочу это делает. Когда я смотрю, что функция печатает, все прошло хорошо. Когда внутри функции я печатаю внутренний массив, а вход модифицирован, я получаю тот же результат. Но когда дело доходит до основной функции для печати, похоже, что ничего не произошло. Здесь вы видите исходный код выше.

----- 
Print start_state. 
----- 
start_state[0][level] = 0, start_state[0][elements] = 4. 
start_state[1][level] = 1, start_state[1][elements] = 4. 
start_state[2][level] = 2, start_state[2][elements] = 32. 
start_state[3][level] = 2, start_state[3][elements] = 32. 
start_state[4][level] = 4, start_state[4][elements] = 64. 
start_state[5][level] = 3, start_state[5][elements] = 64. 
start_state[6][level] = 2, start_state[6][elements] = 64. 
start_state[7][level] = 1, start_state[7][elements] = 8. 
start_state[8][level] = 2, start_state[8][elements] = 8. 
start_state[9][level] = 3, start_state[9][elements] = 48. 
start_state[10][level] = 4, start_state[10][elements] = 64. 
start_state[11][level] = 3, start_state[11][elements] = 64. 
start_state[12][level] = 2, start_state[12][elements] = 4. 
start_state[13][level] = 3, start_state[13][elements] = 4. 
start_state[14][level] = 4, start_state[14][elements] = 12. 
start_state[15][level] = 3, start_state[15][elements] = 12. 
start_state[16][level] = 2, start_state[16][elements] = 16. 
start_state[17][level] = 1, start_state[17][elements] = 8. 
----- 
Print values array inside function merge 
------ 
Level merge[0]: 0, elements merge[0]: 4. 
Level merge[1]: 1, elements merge[1]: 4. 
Level merge[2]: 2, elements merge[2]: 64. 
Level merge[3]: 3, elements merge[3]: 64. 
Level merge[4]: 2, elements merge[4]: 64. 
Level merge[5]: 1, elements merge[5]: 8. 
Level merge[6]: 2, elements merge[6]: 8. 
Level merge[7]: 3, elements merge[7]: 112. 
Level merge[8]: 2, elements merge[8]: 4. 
Level merge[9]: 3, elements merge[9]: 16. 
Level merge[10]: 2, elements merge[10]: 16. 
Level merge[11]: 1, elements merge[11]: 8. 
----- 
Print values state inside function merge 
------ 
Level merge[0]: 0, elements merge[0]: 4. 
Level merge[1]: 1, elements merge[1]: 4. 
Level merge[2]: 2, elements merge[2]: 64. 
Level merge[3]: 3, elements merge[3]: 64. 
Level merge[4]: 2, elements merge[4]: 64. 
Level merge[5]: 1, elements merge[5]: 8. 
Level merge[6]: 2, elements merge[6]: 8. 
Level merge[7]: 3, elements merge[7]: 112. 
Level merge[8]: 2, elements merge[8]: 4. 
Level merge[9]: 3, elements merge[9]: 16. 
Level merge[10]: 2, elements merge[10]: 16. 
Level merge[11]: 1, elements merge[11]: 8. 
----- 
Print the merged start_state. 
----- 
start_state[0][level] = 0, start_state[0][elements] = 4. 
start_state[1][level] = 1, start_state[1][elements] = 4. 
start_state[2][level] = 2, start_state[2][elements] = 32. 
start_state[3][level] = 2, start_state[3][elements] = 32. 
start_state[4][level] = 4, start_state[4][elements] = 64. 
start_state[5][level] = 3, start_state[5][elements] = 64. 
start_state[6][level] = 2, start_state[6][elements] = 64. 
start_state[7][level] = 1, start_state[7][elements] = 8. 
start_state[8][level] = 2, start_state[8][elements] = 8. 
start_state[9][level] = 3, start_state[9][elements] = 48. 
start_state[10][level] = 4, start_state[10][elements] = 64. 
start_state[11][level] = 3, start_state[11][elements] = 64. 
start_state[12][level] = 2, start_state[12][elements] = 4. 
start_state[13][level] = 3, start_state[13][elements] = 4. 
start_state[14][level] = 4, start_state[14][elements] = 12. 
start_state[15][level] = 3, start_state[15][elements] = 12. 
start_state[16][level] = 2, start_state[16][elements] = 16. 
start_state[17][level] = 1, start_state[17][elements] = 8. 

Что нужно изменить, чтобы изменения в исходном массиве были постоянными? Я смотрел в Интернете, и иногда кажется, что так оно и должно работать (не второй ответ на этот вопрос Passing modified array values back to main function in C похож на мой случай, за исключением двумерного массива?), И иногда это выглядит так, как будто я должен ссылаться на массив с помощью указателя.

+1

Вы не можете передать массив в/из функции в C. Только указатель. И вы вряд ли можете сделать что-нибудь полезное с массивом без использования указателя. Даже не получить доступ к элементу. Чего ты хочешь достичь? Предоставьте [mcve] (сосредоточьтесь на ** Минимальном **!). – Olaf

+0

Изменение переменной вызывающего без указателя в C ... Humm довольно уверен, что невозможно – Garf365

+0

Вы не можете сделать это без указателей, потому что без указателей ваша функция получит КОПИЮ значения. Вы можете изменить содержимое, но как только ваша функция закончится, копия будет уничтожена, а оригинал будет сохранен. – Aleksandrus

ответ

0

В merge вы вносите изменения в локальную переменную array. Имеет смысл, что вы не видите изменений в array в вызывающей функции.

Линия

state = array; 

не копирует conents из array в state. Он просто меняется, где state указывает на функцию.

Изменить merge, чтобы изменить state самостоятельно, и вы увидите изменения, видимые в вызывающей функции.

+0

О, боже, я думал, что это должно было быть что-то глупое, но не такое глупое. Большое спасибо. –

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