Изменение значения переменной с не работающими указателями - PullRequest
0 голосов
/ 03 февраля 2019

По сути, у меня есть функция MinSubTab, которая должна вычислять сумму переданного массива, а также изменять значение, переданное в первом аргументе, внутри функции без использования return.Это делается с помощью указателей.В любом случае, я думаю, было бы проще, если бы я просто показал вам код, вот он:

maintab.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "tab.h"

int main(){
    int *reftab;
    int min;
    reftab = (int *)malloc(sizeof(int) * NMAX);
    InitTab(reftab,NMAX);
    printf("\n Total: %d et min: %d", MinSumTab(&min, reftab, NMAX), min);
    free(reftab);
    return 0;
}

tab.c

void InitTab(int *tab, int size){
    srand(time(NULL));
    for (int i=0; i<size; i++){
        *(tab+i) = rand() % 10;
    }
}
int MinSumTab(int *min, int *tab, int size){
    int total=0;
    int minimum = NMAX;
    int temp = *min;
    for (int i=0; i<size; i++){
        total += *(tab+i);
    }
    for (int i=0; i<size; i++){
        if(*(tab+i)<minimum){
            minimum = *(tab+i);
        }
    }
    *min = minimum;
    return total;
}

Таким образом, ожидаемый результат здесь состоит в том, что сумма печатается (что это такое), а минимальное значение массива печатается (что это не так).Каждый раз, когда переменная min равна 8, я понятия не имею, как на самом деле изменить значение min из этой функции.

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

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

В C порядок оценки и передачи аргументов не определен.

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

#include <stdio.h>

volatile char *message[] = {
    "fisrt", "second", "third", "fourth"
};

int print(size_t x)
{
    printf("%s\n", message[x]);
    return x;
}

int main()
{
    printf("%d %d %d %d\n", print(0), print(1), print(2), print(3));

    return 0;
}

Примечание.Из этого правила есть одно исключение.

Логические операторы оцениваются слева направо.

if( x != NULL && *x == 5) безопасен, поскольку x не будет разыменовываться, если он равен NULL

0 голосов
/ 03 февраля 2019

Выглядит как небольшая ошибка:

Вы инициализируете minimum с NMAX, который, как я полагаю, равен 8 (размер массива).99,9% случайных чисел будет больше.Поэтому в качестве минимума выбрано значение 8.

То, что вы действительно хотите, это инициализировать его с помощью RAND_MAX - максимальное значение, которое может вернуть rand().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...