Правильный способ отправить int [] [] функции в C? [Дубликат]

Простой ответ

$p = 1234567;
$p = sprintf("%08d",$p);

Я не уверен, как интерпретировать комментарий, говорящий «Он никогда не будет более 8 цифр», и если он ссылается на ввод или вывод. Если это относится к выходу, у вас должен быть дополнительный вызов substr () для обрезания строки.

Чтобы скопировать первые 8 цифр

$p = substr(sprintf('%08d', $p),0,8);

Чтобы закрепить последние 8 цифры

$p = substr(sprintf('%08d', $p),-8,8);
47
задан David 6 August 2008 в 23:20
поделиться

4 ответа

Вы можете сделать это с любым типом данных. Просто сделайте это указателем на указатель:

typedef struct {
  int myint;
  char* mystring;
} data;

data** array;

. Но не забывайте, что вам все равно придется изменять malloc, и он становится немного сложным:

//initialize
int x,y,w,h;
w = 10; //width of array
h = 20; //height of array

//malloc the 'y' dimension
array = malloc(sizeof(data*) * h);

//iterate over 'y' dimension
for(y=0;y<h;y++){
  //malloc the 'x' dimension
  array[y] = malloc(sizeof(data) * w);

  //iterate over the 'x' dimension
  for(x=0;x<w;x++){
    //malloc the string in the data structure
    array[y][x].mystring = malloc(50); //50 chars

    //initialize
    array[y][x].myint = 6;
    strcpy(array[y][x].mystring, "w00t");
  }
}

Код для освобождения структуры выглядит аналогичным - не забудьте позвонить бесплатно () на все, что вы malloced! (Кроме того, в надежных приложениях вы должны проверить возврат malloc () .)

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

int whatsMyInt(data** arrayPtr, int x, int y){
  return arrayPtr[y][x].myint;
}

Вызовите эту функцию с помощью:

printf("My int is %d.\n", whatsMyInt(array, 2, 4));

Выход:

My int is 6.
19
ответ дан M.M 27 August 2018 в 05:38
поделиться
  • 1
    нужна помощь здесь: stackoverflow.com/questions/16943909/… – Dchris 5 June 2013 в 17:01
  • 2
    Указатель на указательную сегментированную таблицу поиска не является двумерным массивом. Просто потому, что он позволяет синтаксис [][], он не волшебным образом превращается в массив. Вы не можете memcpy () и т. Д., Потому что память не выделяется в смежных ячейках памяти, что требуется для массивов. Ваша таблица поиска довольно разбросана по всей куче, делая поиск медленным, а куча фрагментирована. – Lundin 23 June 2015 в 10:42

Передайте явный указатель на первый элемент с размерами массива в виде отдельных параметров. Например, для обработки 2-мерных массивов произвольного размера для int:

void func_2d(int *p, size_t M, size_t N)
{
  size_t i, j;
  ...
  p[i*N+j] = ...;
}

, который будет называться как

...
int arr1[10][20];
int arr2[5][80];
...
func_2d(&arr1[0][0], 10, 20);
func_2d(&arr2[0][0], 5, 80);

. Этот же принцип применяется для массивов больших размеров:

func_3d(int *p, size_t X, size_t Y, size_t Z)
{
  size_t i, j, k;
  ...
  p[i*Y*Z+j*Z+k] = ...;
  ...
}
...
arr2[10][20][30];
...
func_3d(&arr[0][0][0], 10, 20, 30);
31
ответ дан John Bode 27 August 2018 в 05:38
поделиться
int matmax(int **p, int dim) // p- matrix , dim- dimension of the matrix 
{
    return p[0][0];  
}

int main()
{
   int *u[5]; // will be a 5x5 matrix

   for(int i = 0; i < 5; i++)
       u[i] = new int[5];

   u[0][0] = 1; // initialize u[0][0] - not mandatory

   // put data in u[][]

   printf("%d", matmax(u, 0)); //call to function
   getche(); // just to see the result
}
-2
ответ дан Markus Safar 27 August 2018 в 05:38
поделиться
  • 1
    [Д0] stackoverflow.com/questions/16943909/… – Dchris 5 June 2013 в 17:02
  • 2
    Это не 2D-массив, это таблица поиска. Кроме того, это помечено C. – Lundin 23 June 2015 в 10:45

Вы можете объявить свою функцию как:

f(int size, int data[][size]) {...}

Затем компилятор выполнит всю арифметику указателя для вас.

Обратите внимание, что размеры размеров должны отображаться перед самим массивом.

GNU C разрешает переадресацию объявлений аргументов (в случае, если вам действительно нужно передать размеры после массива):

f(int size; int data[][size], int size) {...}

Первое измерение, хотя вы также можете передать аргумент, бесполезно для компилятора C (даже для оператора sizeof при применении к массиву, переданному как аргумент, всегда будет рассматриваться как указатель на первый элемент).

15
ответ дан rslemos 27 August 2018 в 05:38
поделиться
  • 1
    ИМО это должен быть принятый ответ. Никакого дополнительного кода не требуется и нет ненужных распределений кучи. простой и чистый – imkendal 27 April 2015 в 17:03
  • 2
    Спасибо @kjh, я также думаю, что это самое чистое решение. Принятый ответ - тот, который работал на него. Посмотрите: OP с 2008 года, почти за 6 лет до моего ответа. Кроме того, я не знаю, поддерживаются ли тогда стандарты C для синтаксиса, который я использовал здесь. – rslemos 30 April 2015 в 03:23
  • 3
    Это решение, которое я, наконец, принял для передачи целочисленной матрицы (двухмерного массива) размера M x N в качестве аргумента функции. Может быть, будет немного полезной информация: прототип функции похож: void f (int N, int data [] [N], int M); В теле функции элемент [m] [n] может быть записан как данные [m] [n] - очень удобно, нет необходимости в вычислении индекса. – jonathanzh 19 May 2015 в 09:08
  • 4
    Я объявляю функцию, как вы сказали, я вызываю ее из main (), и все в порядке, но как мне объявить переменную data в моей main (), если я не знаю размеров? Я пытался с int* data, но не сработал. – Glk-78 27 August 2017 в 11:30
Другие вопросы по тегам:

Похожие вопросы: