Как распределять договоренность, возвращенную функцией в договоренность главной программы?

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

Я хотел бы знать, как это правильная форма, или если она эта, и я это врежу. Спасибо!

Ошибка, которая помечает меня, - эта:

invalid conversion from `int*' to `int'
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

using namespace std;

int * iniciararreglo();

int main()
{
    int a[100];
    *a=iniciararreglo();    

    system("PAUSE");
    return 0;
}

int * iniciararreglo()
{ int num,arreglo[100];
    srand(time(NULL));

    for (int i=0;i<=99;i++)
    { num=0+ rand()%(100);
        arreglo[i]=num; }
    return *arreglo; }
1
задан 24.01.2017, 15:42
0 ответов

Ошибка, которая появляется у тебя, проистекает того, что ты стараешься распределять стоимость int* (указатель), в переменную [] (договоренность). Следовательно составитель показывает тебе эту ошибку.

Решение

Вместо того, чтобы делать, что функция iniciararreglo() возвратите элемент int мы будем способствовать тому, чтобы в Вашем месте он ничего не возвратил, больше как аргумент мы переместим его договоренность, в которой были введены все числа.

#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

using namespace std;

void iniciararreglo(int arreglo[100]);

int main() {

    int a[100];
    iniciararreglo(a);

    // Imprimimos el arreglo
    for(int i = 0; i < 100; i++){
        cout << a[i] << endl;
    }

    system("PAUSE");
    return 0;
}

void iniciararreglo(int arreglo[100]) {

    int num;
    srand(time(NULL));

    for (int i = 0; i <= 99; i++) {
        num = 0 + rand() % (100);
        arreglo[i] = num;
    }

    return;
}

Результат:

66
9
1
84
80
52
7
26
75
...
0
ответ дан 03.12.2019, 17:31

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

int a[100];

Эта договоренность - сто элементов типа int.

Технические детали.

Так в C как в C ++ имя договоренности равняется указателю в первое положение того же самого; могут быть использованными различные операторы на указателе, чтобы соглашаться на различные данные, например:

Оператор квадратные скобки [].

Оператор квадратные скобки позволяет тебе показывать перемещение относительно начала договоренности, продолжая твою договоренность примера помещая нуль (0) между квадратными скобками рядом с договоренностью a мы согласились бы в на первое положение:

a[0] = 42;

Если вместо нуля мы помещали один 99 мы согласились бы на сотое положение:

a[99] = 0b101010;

Это функционирует так из-за функции, известной в качестве "арифметики указателей", которая в большие черты значит, что складывая стоимость в указатель он возвращает новый указатель указывая на адрес памяти первоначального указателя, прокрученного так часто как стоимость, умноженная на размер остроконечного типа. Ты можешь видеть больше деталей в этом трэде.

Оператор des-ссылки *.

Оператор des-ссылки, примененный на указателе возвращает остроконечную информацию, следовательно, если мы имеем указатель по отношению к целому числу (int *) и дай это мы снабжаем ссылками, получаем целое число (int).

Проблема.

В твоем коде ты используешь следующие инструкции:

int a[100];
*a=iniciararreglo();
int * iniciararreglo()
{ int num,arreglo[100];
// ...
    return *arreglo; }

Поскольку мы только что прочитали, инструкции *a и *arreglo они дай снабжая ссылками указатель (имя договоренности - указатель в первый элемент договоренности). Следовательно тип инструкций *a и *arreglo он int. Функция iniciararreglo() возврати стоимость типа int * как смоги поверните в Вашем заявлении:

int * iniciararreglo();

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

invalid conversion from `int*' to `int'

Рисунок функции iniciararreglo().

Поскольку я могу видеть в твоей функции, ты возвращаешь внутреннюю договоренность функции:

int * iniciararreglo()
{ int num,arreglo[100];
    srand(time(NULL));

    for (int i=0;i<=99;i++)
    { num=0+ rand()%(100);
        arreglo[i]=num; }
    return *arreglo; }

Договоренность arreglo принадлежи контексту функции iniciararreglo и прекрати существовать, когда он заканчивает функцию, так что вслед за инструкцией return *arreglo; он возвратил бы память, которая прекращает существовать в том же моменте, который делается return.

Предложение.

Функция iniciararreglo() он не был бы должен возвращать никакой информации, если не, что был бы должен получать указатель и размер:

void iniciararreglo(int *puntero, int elementos)
{
    for (int i = 0; i < elementos; ++i)
    {
        puntero[i] = rand() % 100;
    }
}

Она была бы использована так:

int main()
{
    int a[100];
    iniciararreglo(a, 100);

    system("PAUSE");
    return 0;
}
0
ответ дан 03.12.2019, 17:31
  • 1
    я протестировал решение, которое ты сказал мне, но он дал мне эту ошибку: " void оцените not ignored туз it ought to be" –  27.01.2017, 16:11
  • 2
    @MacaIgoillo тысяча прощений, - ошибка mí или призыв к iniciararreglo должен быть así: iniciararreglo(a, 100); (не помещая *a в левую сторону). Я исправляю ответ. –  28.01.2017, 22:51
  • 3
    @PaperBirdMaster, не беспокойся. Уже usó мой có я говорю для Вашего следующего вопроса es.stackoverflow.com/questions/46340/… даже не принимает, ни upvote, ни n' в n' в –  28.01.2017, 23:09