У меня есть проект, который требует следующих вещей. Напишите программу на языке C и на языке ассемблера MIPS, которая:

Initializes an integer array with 3 rows and 5 columns:
     1   2   3   4   5
     6   7   8   9   10
    11 12 13 14 15

-вводит номер строки и столбца от пользователя

-main вызывает дочернюю функцию, которая вычисляет адрес памяти выбранной строки и столбца следующим образом:

    int arrayAddress( int row, int col, int ncolumns, array); //returns address of array[row][col]
    use shift instead of multiply where appropriate
print the address and the value of the chosen array element.

И проблема в том, что я не знаю, как сделать следующее -

Получить int ncolumns, так как ввод int ncolumns = my_array [] [5] приводит к ошибкам

Удалите следующие ошибки, показанные на втором изображении

Ошибки

warning: assignment to ‘int *’ from incompatible pointer type ‘int (*)[5]’ [-Wincompatible-pointer-types]

На arrayAddress_A = my_array;

warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]

On printf ("Адрес памяти:% x \ n", arrayAddress_A);


warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
   printf("Value : %d", arrayAddress_A);

На printf ("Значение:% d", arrayAddress_A);

И могут быть другие ошибки, о которых я не знаю.

Код у меня есть:

#include <stdio.h>
 
int main()
{
  // array declaration and initialization
  int my_array[3][5] = {
    {1 ,2 ,3, 4, 5},      //row 1
    {6 ,7 ,8, 9, 10},      //row 2
    {11, 12, 13, 14, 15},      //row 3
  };
  
  {
      int i = 0;
      int j = 0;
      int ncolumns = 5;
      my_array[i][j];
      printf("Enter Row : \n");
      scanf("%d",&i);
      printf("Enter Collumn : \n");
      scanf("%d",&j);
    
  int arrayAddress(int my_array, int i, int j, int ncolumns);
  {
      int* arrayAddress_A;
      arrayAddress_A = my_array;
      arrayAddress_A += i * ncolumns + j;
      printf("Memory Address : %x\n",arrayAddress_A);
      printf("Value : %d", arrayAddress_A);
  }
  
  }
}
0
Meaningless Code 11 Окт 2021 в 15:34

2 ответа

Лучший ответ

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

#define ROWS 3//array dimensions 
#define COLS 5

void arrayAddress(int i, int j, int my_array[i][j]);

int main(void)
{
  // array declaration and initialization
  int my_array[ROWS][COLS] = {
    {1 ,2 ,3, 4, 5},      //row 1
    {6 ,7 ,8, 9, 10},      //row 2
    {11, 12, 13, 14, 15},      //row 3
  };
  

    int i = 0;
    int j = 0;
    //int ncolumns = 5;//unknown what purpose was in original
    //my_array[i][j];  //and not essential for this illustration
    printf("Enter Row : \n");
    scanf("%d",&i);
    printf("Enter Column : \n");
    scanf("%d",&j);

    arrayAddress(ROWS, COLS, my_array);
    return 0;
}

//Definition of function prototype above
//illustrates accessing all values in array passed as argument
//via printf statement
void arrayAddress(int rows, int cols, int my_array[rows][cols])
{
    //int* arrayAddress_A;
    //arrayAddress_A = my_array;
    //arrayAddress_A += i * ncolumns + j;
    for(int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {       
            printf("Memory Address : %p\n",&my_array[i][j]);//note use of & (address of operator)
            printf("Value : %d", my_array[i][j]);
        }
    }
}
0
ryyker 11 Окт 2021 в 13:47

Не знаю, поможет ли это вам, но вы можете использовать функцию malloc:

int main ()
{
  int **my_array = malloc(sizeof(int*)*3);
  for(int i=0; i!=3; i++) {
    my_array[i] = malloc(sizeof(int)*5);
  }
}

И не забудьте "free ()" использовать тот же цикл for после использования вашего массива! :)

int main()
{
...
  for(int i=0; i!=3; i++) {
    free(my_array[i];
  }
  free(my_array);
}
0
Alexandre FRANTZ 11 Окт 2021 в 13:08