Что не так со следующим кодом?Как это исправить? - PullRequest
3 голосов
/ 27 сентября 2010

Как вернуть статический многомерный массив символов?

#include<stdio.h>
#include<conio.h>

#define SIZE 3

char ** MyFunction(void)
{
    static char arr[SIZE][SIZE]={
                                    {'A', 'B', 'C'},
                                    {'D', 'E', 'F'},
                                    {'G', 'H', 'I'}
                                };
    return arr;
}

void main(void)
{
    char ** arr1 = NULL;
    int i=0;
    int j=0;

    arr1 = MyFunction();

    for(i=0 ; i<SIZE ; i++)
    {
        for(j=0 ; j<SIZE ; j++)
        {
            printf("%c, ", arr1[i][j]);
        }

        printf("\n");
    }

    getch();
}

Ответы [ 5 ]

4 голосов
/ 27 сентября 2010

Прежде всего, arr не может быть char**.Это адрес, но это не адрес указателя - это адрес символа [SIZE].

Мне всегда было проще справиться с этим, разделив измерения с помощью typedefs.

#define SIZE 3 
typedef char ROW[SIZE];   // a ROW type is an array of chars

ROW* MyFunction(void) 
{ 
     static ROW arr[SIZE]={  // arr is an array of ROW objects 
                                    {'A', 'B', 'C'}, 
                                    {'D', 'E', 'F'}, 
                                    {'G', 'H', 'I'} 
                                }; 
    return arr; 
} 

void main(void) 
{ 
    ROW* arr1 = NULL;
    // etc...
1 голос
/ 27 сентября 2010

с учетом декларации

char arr[SIZE][SIZE];

тогда тип выражения arr равен char (*)[SIZE]; следовательно, тип функции должен быть

char (*myFunction(void))[SIZE] // myFunction returns a pointer to a SIZE-element
{                              // array of char
  static char arr[SIZE][SIZE] = ...;
  return arr;
}

Да, определение типа функции ужасно. Версия typedef Джеймса читается легче, но это то, что происходит под прикрытием.

int main(void)
{
  char (*arr1)[SIZE];
  int i, j;

  arr1 = myFunction();
  ...
}
0 голосов
/ 28 сентября 2010

conio.h + getch () не является ANSI C. void main не является ANSI C. Возьмите новый тип, это упростит.

#include<stdio.h>
#include<conio.h>

#define SIZE 3
typedef char CHAR3[SIZE];

CHAR3 *MyFunction(void)
{
    static CHAR3 arr[]={
                                    {'A', 'B', 'C'},
                                    {'D', 'E', 'F'},
                                    {'G', 'H', 'I'}
                                };
    return arr;
}

main(void)
{
    CHAR3 *arr1 = NULL;
    int i=0;
    int j=0;

    arr1 = MyFunction();

    for(i=0 ; i<SIZE ; i++)
    {
        for(j=0 ; j<SIZE ; j++)
        {
            printf("%c, ", arr1[i][j]);
        }

        printf("\n");
    }

   getch();
}
0 голосов
/ 28 сентября 2010

Кому принадлежит массив?

Это очень важно, потому что некоторая часть кода должна полностью владеть (создавать, удалять) массивом.Другие части кода могут читать и записывать.

С этой философией я бы изменил код так, чтобы функция main (в действительности это могла быть любая функция) стала владельцем arr1.main создает arr1 и передает его другой функции (может быть в другом модуле) для ее «инициализации».Вот модифицированная версия программы.

#include <stdio.h>

enum{ SIZE = 3 };

void initArray( char arr[ SIZE ][ SIZE ] ) {

    char x = 'A';

    for( int i = 0; i < SIZE; i++ ) {
        for( int j = 0; j < SIZE; j++ ) {
            arr[ i ][ j ] = x;
            x += 1;
        }
    }
}

int main()
{
    char arr1[ SIZE ][ SIZE ];
    initArray( arr1 );

    for( int i = 0; i < SIZE; i++ ) {
        for( int j = 0; j < SIZE; j++ ) {
            printf("%c, ", arr1[ i ][ j ]);
        }
        printf("\n");
    }
}

Потратив несколько минут на поиск, я нашел хорошее обсуждение многомерного массива в C .

Еще один комментарий на стороне.пожалуйста, обратите внимание, что я сделал несколько других изменений в коде, некоторые из них - дизайн (например, использование enum вместо #define, объявление переменных (i, j в большинстве локальных областей), в то время как некоторые форматируют.в основном для общения с другими программистами, поэтому читабельность кода очень важна.

0 голосов
/ 28 сентября 2010

изменить на статический символ ** arr [] [] = ...

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