В
while( *ap != -1){
s.arr[i++]=va_arg(ap,int);
printf("%d was entered\n",s.arr[i]);
c++;
}
вы увеличиваете i
при записи значения.Когда вы пытаетесь напечатать s.arr[i]
, вы на один шаг впереди того места, где вы сохранили значение.
Увеличение после печати?
while( *ap != -1){
s.arr[i]=va_arg(ap,int);
printf("%d was entered\n",s.arr[i]);
i++;
c++;
}
Вы работаете int read_set(set s,...)
берет копию set
s
и помещает в нее вещи.К тому времени, когда вы вернетесь к вызывающей функции в main, скопированный вами set
не изменится.Вам нужно отправить указатели на переменные, чтобы изменить их:
int read_set(set *ps,...)
, а затем вызывающему коду потребуется отправить адрес x = read_set(&SETA, 2, 3, 4, -1);
, чтобы вы могли изменить то, что находится в наборе.Альтернатива - вернуть заполненную структуру.
Еще две вещи, о которых стоит подумать.Во-первых, вы можете объявить свой набор внутри main - у него нет причин быть глобальным.И вам не нужно это делать.
int main() {
set setA; //style/design point. Also don't shout.
//... etc
}
Также обратите внимание на функцию печати.Он использует while (*iptr++)
, поэтому проверяет 0 или NULL, чтобы остановить цикл.Я не вижу никаких нулей, так что это нужно переосмыслить.И хотите ли вы иметь set
, который не будет отображать ничего, кроме 0?