Lilyanaa Ответов: 2

Передайте две структуры одной и той же функции в C


Привет, я хотел бы знать, как я могу передать две структуры в одну и ту же функцию. Я получаю ошибку
error: incompatible type for argument 1 of fun
если я использую две структуры как один и тот же тип.
Вот этот код

Что я уже пробовал:

typedef struct First            		
   {
    //members
    ....
   }first;

void fun( first f[size] ){
// some computation on str1 and I want to applay same computation on str2
 ....
 for(i=0;i<3;i++){
    f[i].member +=5;
 }
} 
void cal(first str1[4],first str2[4] ){
// some calculation on str1
for(i=0;iNsomesize;i++){
str2[i].member=str1[i].member;
}
fun(str2[4]);

}

 void main(){
first str1[4]; 
first str2[4];
fun(str1); // I call just str1 because firstly I want to applay fun computation on 
              //str1
}

2 Ответов

Рейтинг:
2

OriginalGriff

Во-первых, str1 не является first, это массив первых объектов:

first str1[4];
Таким образом, ваше определение метода должно соответствовать этому, как это происходит с cal.
Но здесь есть проблемы, так как str2-это массив из 4 первых объектов, так что это:
str2[0].member=fun(str2[4]);
Пытается получить доступ к Пятому элементу массива teh - индексы C начинаются с нуля, помните.
Если вы пытаетесь передать один экземпляр first to fun, то объявите его как
void fun(first f) {
...
}
И вызовите его с помощью элемента из одного из ваших массивов:
fun(str1[0]);
fun(str1[1]);
fun(str1[2]);
fun(str1[3]);
fun(str2[0]);
fun(str2[1]);
fun(str2[2]);
fun(str2[3]);
Если вы хотите передать массив первых объектов:
void fun(first f[]) {
...
}
И передайте ему массив:
fun(str1);
fun(str2);
Но в любом случае, это не сработает:
str2[0].member=fun(str2[4]);
Поскольку fun - это пустая функция-iut не может возвращать значение, поэтому его можно использовать справа от знака равенства.

Я думаю, что вам нужно сесть и перечитать свои заметки о курсе: вы, кажется, немного смущены тем, что вы пытаетесь сделать здесь.


Lilyanaa

спасибо за ваши заметки, можете ли вы увидеть мое обновление, пожалуйста, я делаю что-то подобное, но ошибка того же несовместимого типа для аргумента 1 веселья

OriginalGriff

Решайся!

fun(str2[4]);
...
fun(str1);
Поскольку str1 и str2 объявляются одинаково ...

Рейтинг:
12

CPallini

Вам нужны указатели. Давайте попробуем простой пример

#include <stdio.h>

typedef struct
{
  int x, y;
} Point;

void doubleIt( Point * p )
{
  p->x = p->x * 2;
  p->y = p->y * 2;
}

void printIt( const Point * p)
{
  printf("{%d, %d}\n", p->x, p->y);
}

int main()
{
  Point p1, p2;
  Point pa[4];
  int n;

  p1.x = 1;
  p1.y = 1;

  p2.x = 0;
  p2.y = 2;

  // accessing p1
  printIt( &p1);
  doubleIt(&p1);
  printIt( &p1);

  // accessing p2
  printIt( &p2);
  doubleIt(&p2);
  printIt( &p1);

  // accessing the pa array
  for (n = 0; n<4; ++n)
  {
    pa[n].x = n;
    pa[n].y = -n;
    printIt(&pa[n]);
    doubleIt(&pa[n]);
    printIt(&pa[n]);
  }
}


Lilyanaa

Ладно, спасибо, что-то вроде этого ... но можно ли обойтись без указателя?

CPallini

Освоение указателей является обязательным, чтобы кодировать на языке программирования Си.