Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
K2rusH
0 / 0 / 0
Регистрация: 10.04.2009
Сообщений: 7
#1

Различные типы данных в динамическом массиве - C++

14.04.2009, 09:15. Просмотров 933. Ответов 4
Метки нет (Все метки)

error C2297: '*' : illegal, right operand has type 'float [3]'
Получаю вот такую ошибку. В связи с небольшим опытом, понять в чём дело не могу.
А вот само задание:Написать процедуру заполнения динамического массива размера (10х10) целыми случайными числами определяемыми выражением у=20*cos(8*Ci+3)+10*cos(5*Cj+7) , где ci, cj – случайные числа из диапазона [-2Пи - 2Пи]. С помощью определить элемент массива, имеющий наибольшее значение. Результат вывести на экран.

Последнее задание не делал, так как с основой проблемы.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define N 10
 
int main()
{
    float  **a;
    float Cj[N],Ci[N];
    int i, j;
    srand(time(0));
    a = (float**)malloc(N * sizeof(float));
    for(i=0; i<N; i++)
       a[i] = (float*)malloc(N * sizeof(float));  
    printf("A = \n");
    for(i=0; i<N; i++) {
        Ci[i]=rand()%3-3;
        Cj[i]=rand()%3-3;
       for(j=0; j<N; j++) {
          a[i][j]=20*cos(8*Ci+3)+10*cos(5*Cj+7);
          printf("%f   ", a[i][j]);
       }
       printf("\n");
    }
    for(i=0; i<N; i++)
       free(a[i]);   
    free(a);
    getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2009, 09:15     Различные типы данных в динамическом массиве
Посмотрите здесь:

Сдвиг в динамическом массиве C++
Реализация стека в динамическом массиве C++
C++ Поменять местами столбцы в динамическом массиве
C++ Преобразование типов в динамическом массиве
Циклический сдвиг в двумерном динамическом массиве C++
C++ Ошибка в одноиерном динамическом массиве
C++ Деление в двухмерном динамическом массиве
C++ Вычислить значение выражения, используя различные вещественные типы данных. (есть код)
C++ Музыкальная картотека в динамическом массиве
Как исправить ошибку в динамическом массиве? C++
Ошибка C2371 int32_t: переопределение, различные базовые типы C++
C++ Добавить / отнять элемент в динамическом массиве

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RazorQ
576 / 343 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
14.04.2009, 09:26     Различные типы данных в динамическом массиве #2
Цитата Сообщение от K2rusH Посмотреть сообщение
C++
1
float ***a;
Здесь указатель на указатель. Убери одну звёздочку
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.04.2009, 09:56     Различные типы данных в динамическом массиве #3
Код
    float Cj[N],Ci[N];
Код
    float C[N][N];
Код
    a = (float**) malloc(N*sizeof(float));
Код
    a = (float**) malloc(N*sizeof(float *));
Код
    20*cos(8*Ci+3)+10*cos(5*Cj+7);
Код
    20*cos(8*C[i]+3)+10*cos(5*C[j]+7);
вообще конечно
Код
    float Cj[N],Ci[N];
Код
    float C[N][N];
Код
    float ci, cj;
это же просто числа

кстати в math.h определена константа M_PI - число пи
K2rusH
0 / 0 / 0
Регистрация: 10.04.2009
Сообщений: 7
14.04.2009, 20:31  [ТС]     Различные типы данных в динамическом массиве #4
Не смог осознать направление действия в твоём коде. Можно немного поподробнее?
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.04.2009, 23:08     Различные типы данных в динамическом массиве #5
смысл в том, что вместо Ci[N] и Сj[N] юзаются просто переменные ci и cj, можно их заранее заполнить, тогда подойдёт одна таблица c[N][N], вместо двух массивов

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

дальше, когда для a выделяешь память, у тебя выделяется массив указателей для строк конечной таблицы, а потом к ним подключаются выделенные массивы, функция malloc возвращает указатель на значение void'ового типа, такой указатель можно писать без приведения, так как, начиная со стандарта ANSI C89, void'овые указатели можно присваивать как в ту, так и в обратную сторону (то есть их можно присваивать любым указателям и им можно присваивать любые указатели), но некоторые компиляторы пишут, что это неправильно (может для C++ неправильно, они вводят там новые правила свои и когда компилишь для C++ могут правила C++ накладывать на сишный код), поэтому приведение пишут явно
когда ты выделяешь память под масив указателей на строки, malloc возвращает указатель на массив указателей, поэтому его явно нужно привести к типу float **, потому что она вернула указатель на указатель на значение, а вот когда ты уже выделил память под массив указателей на строки, ты уже создаёшь эти строки и malloc возвращает указатель на первый элемент строки и его явно нужно привести к типу float *, потому что она вернула указатель на значение типа float

когда будешь юзать просто переменные, которые генерятся прямо в цикле, то и в формуле нужно юзать не Ci или C[i], а просто ci для левого слагаемого и cj для правого

Код
rand()%3-3;
Код
rand()%(2*M_PI+0.1);
Код
rand()%(2*M_PI+0.1)-2*M_PI;
0.1 - потому что включает и -2PI и 2PI
Yandex
Объявления
14.04.2009, 23:08     Различные типы данных в динамическом массиве
Ответ Создать тему
Опции темы

Текущее время: 02:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru