Для C89 и более ранних размеров размеры массива в объявлении массива должны быть константными выражениями , что означает, что они должны оцениваться во время компиляции (числовые константы, sizeof
выражения, выражения с числовыми константами и / илиsizeof
выражения или макросы, которые расширяются до любого из предыдущих).
C99 представил «массивы переменной длины», где размеры массива определяются с помощью выражений времени выполнения (что накладывает некоторые ограничения на использование VLA):
int blocks = some_value();
int seg = some_other_value();
int memory[blocks][segs];
К сожалению, реализация Microsoft Visual Studio в Microsoftне поддерживает массивы переменной длины (или многое другое, кроме C89).
Итак, у вас есть выбор - вы можете использовать другой компилятор, который поддерживает C99 или более позднюю версию (например, MinGW), или вам нужно будет использовать динамическое распределение памяти.Если вы хотите сохранить BLOCKS
постоянной, но SEG
переменной, вам нужно будет сделать что-то вроде этого:
int *memory[BLOCKS];
int seg;
...
scanf( "%d", &seg );
...
for ( int i = 0; i < BLOCKS; i++ )
{
memory[i] = malloc( sizeof *memory[i] * seg );
if ( !memory[i] )
// handle memory allocation failure
}
Когда вы закончите, вам нужно free
этой памяти:
for ( int i = 0; i < BLOCKS; i++ )
free( memory[i] );
Основным недостатком этого метода является то, что строки массива не будут смежными в памяти - между memory[i][seg-1]
и memory[i+1][0]
будет разрыв.Если это имеет значение, вам, возможно, придется выделить память как один блок, а затем фальсифицировать 2D-индексацию:
int *memory = malloc( sizeof *memory * BLOCKS * seg );
if ( !memory )
// handle memory allocation failure
...
memory[i * BLOCKS + j] = some_value();
РЕДАКТИРОВАТЬ
Вот пример (не проверенный!)в фрагменте вашего вопроса - вы пытаетесь прочитать файл .csv с фиксированным числом строк (BLOCKS
) и переменным числом столбцов (SEG
):
#include <stdio.h>
#include <stdlib.h>
#define BLOCKS 20
int *memory[BLOCKS];
int main( void )
{
int seg;
FILE *stream = fopen( “file.csv”, “r” );
if ( !stream )
// print error and exit
printf( “Please enter a number: “);
if ( scanf( “%d”, &seg ) != 1 )
// print error and exit
for ( size_t b = 0; b < BLOCKS; b++ )
{
/**
* Allocate memory for a block (row)
*/
memory[b] = malloc( sizeof *b * seg );
if ( !memory[b] )
// print error and exit
/**
* Read that row from the file - since it has
* a .csv extension, I am assuming it is
* comma-delimited. Note that malloc is not
* required to initialize memory to any specific
* value - the initial value of each memory[b][s]
* is indeterminate.
*/
for ( size_t s; s < seg; s++ )
if ( fscanf( stream, “%d%*c”, &memory[b][s] )) != 1 )
// print error and exit
}
fclose( stream );
/**
* Do stuff with memory here
*/
/**
* After you’re done with memory, free it
*/
for ( size_t b = 0; b < BLOCKS; b++ )
free( memory[b] );
return EXIT_SUCCESS;
}