Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2014, 22:19   #1
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию Рандомное заполнение вещественного массива указателей. Возможно ли?

Здравствуйте! Есть программа ввода/вывода массива на консоль, хочу представить массив как массив указателей, но что-то не очень выходит.

То есть есть массив указателей, заполнить его числами рандомно и вывести разыменованные указатели...ну как-то так.

Код:
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    srand(time(NULL)); // рандом по времени
    const int n=20;  //всего 20 элементов массива
    float *arr[n];   //объявляем массив указателей
    float *pa=arr[0]; // в переменную адреса помещаем указатель на 0 элемент массива



    for (int i=0; i<n;i++)   //заполняем 20 элементов
    {
        *arr[pa]=rand()%200;  // в разыменованный массив указателей вводим число
        printf("%f\t",*arr[pa]); //выводим это число
        pa++;                       //переходим на 64 (вроде у float 64 бита) далее 
    }
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 13.12.2014, 23:18   #2
Gekan
Пользователь
 
Регистрация: 29.06.2012
Сообщений: 39
По умолчанию

Всё-таки в цикле дожна использоваться переменная i.
Gekan вне форума Ответить с цитированием
Старый 14.12.2014, 00:03   #3
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Разве i? Да, должна, если массив не описан как указатель, а тут я просто 20 раз заполнить ячейки памяти пытаюсь, начиная с адреса pa, ребят, хелп!)
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 14.12.2014, 00:31   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
float *arr[n]; //объявляем массив указателей
Супер. Обьявил импичмент несуществующему президенту.
Где запрос на получение памяти для этих указателей?
Если ты думаешь что вот так просто массив указателей тебе Си разместит в память то ты ошибаешься.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2014, 00:56   #5
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

С указателями пытаюсь сам разобраться, для этого решил переделать старую программу, у меня не компилируются 2 строчки после for. Stilet, как же инициализировать память для массива указателей на вещественные числа?)
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 14.12.2014, 01:23   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
const int n = 20;
float *arr[n];
float **pa = arr;
for (int i = 0; i < n; ++i) {
    *pa = malloc(sizeof(float));
    **pa = rand() % 200;
    printf("%f ", **pa);
    ++pa;
}
for (int i = 0; i < n; ++i)
    free(arr[i]);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 14.12.2014 в 01:26.
BDA на форуме Ответить с цитированием
Старый 14.12.2014, 01:53   #7
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Какие-нибудь библиотеки нужно будет подключать? Что значит**-двойной указатель, я опять запутался, почему ++pa, а не pa++? Free-аналог arr:=nil; на делфи? Спасибо)

З.ы. а как потом работать с таким массивом? Допустим я хочу его отсортировать потом.
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 14.12.2014, 12:05   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

free() аналог freemem()
Двойной указатель это указатель на ячейку памяти в которой в свою очередь находится указатель на какие-то данные. Зачастую применяются в двумерных массивах. Например: http://www.programmersforum.ru/showp...4&postcount=27

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

Однако я свангую:
Код:
    srand(time(NULL)); // рандом по времени
    const int n=20;  //всего 20 элементов массива
    float *arr=new float[n];  
    float *p=arr;
    for (int i=0; i<n;i++)
    {
        *p=rand()%200; 
        printf("%f\t",*p);
        p++; 
    }
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2014, 18:40   #9
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Код:
#include <QCoreApplication>
#include <qmath.h>
#include <ctime>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    srand(time(NULL)); // рандом по времени
     const int n=20;  //всего 20 элементов массива
     float *arr=new float[n];
     float *p=arr;
     for (int i=0; i<n;i++)
     {
         *p=rand()%200;
         printf("%f\t",*p);
         p++;
     }

    // поиск второго по величине элемента
    int max=arr[0],buf,count=0;
    buf=max;
    for (int i=0;i<n;i++)
    {
        count+=(arr[i]==buf);
        if(arr[i]>max)
        {
            buf=max;
            max=arr[i];
        } else
            if(arr[i]>buf) buf=arr[i];

    }
    printf("\n----------------------------------------------\n");
    if (count>0)
    {

        printf("\n iskomoe chislo: %d",buf);
        printf("\n Bsego Bxogenii: %d",count);}
    else
        printf("\nNET BXOGENII ");
    return a.exec();
}
жуть, но почему-то работает, да-да, та самая старая задача, дак мы заполнили массив?:D
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 14.12.2014, 19:19   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Если нужно найти количество вхождений второго по величине элемента, то работает неверно.
Пример:
Цитата:
2.000000 0.000000 4.000000 0.000000 3.000000 4.000000 2.000000 1.000000 1.000000 4.000000 3.000000 0.000000 2.000000 4.000000 4.000000
----------------------------------------------

iskomoe chislo: 4
Bsego Bxogenii: 4
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение массива с использованием указателей Shelbanin Общие вопросы C/C++ 4 02.05.2013 18:41
Рандомное заполнение стринггрид toha_master Общие вопросы Delphi 4 19.10.2012 00:43
Рандомное заполнение MaxiCool Помощь студентам 1 15.04.2011 18:04
Рандомное заполнение массива и стринггрида Repac123456 Помощь студентам 5 09.11.2010 00:29
Рандомное заполнение массива ac1d_buRn Помощь студентам 15 03.05.2010 09:14