Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
6 / 6 / 6
Регистрация: 15.10.2014
Сообщений: 98
1

Поворот массива на 90 градусов (cannot convert form char to char*)

06.11.2014, 23:48. Показов 1311. Ответов 7
Метки нет (Все метки)

Пытаюсь повернуть массив на 90 градусов.
Понимаю что проблема в преобразовании данных, но не знаю как исправить(
Может кто подсказать и объяснить в чем различие между char и char*?

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <stdio.h>
 
using namespace std;
 
const int sizeTB = 4;
char* TurnBrick[][sizeTB] =
{
    "    ",
    "  0 ",
    " 000",
    "    "
};
 
int main()
{
    int n = 4;
    int i,j;
    char b;
    
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
        {
            cout << TurnBrick[i][j];
        }
        cout << endl;
    };
 
    for (i=0;i<n/2;i++)
    {
        for (j=i;j<n-1-i;j++)
        {
            b=TurnBrick[i][j];
            TurnBrick[i][j]=TurnBrick[n-j-1][i];
            TurnBrick[n-j-1][i]=TurnBrick[n-i-1][n-j-1];
            TurnBrick[n-i-1][n-j-1]=TurnBrick[j][n-i-1];
            TurnBrick[j][n-i-1]=b;
        }
    };
 
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
        {
            cout << TurnBrick[i][j];
        }
        cout << endl;
    };
    return 0;
}
0

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

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2014, 23:48
Ответы с готовыми решениями:

Ошибка в cannot convert char * to char вроде поправил теперь выводит ересь(
Всем доброго дня! У меня такая проблемка.... написал программу, но сначала она ругалась на Cannot...

Обойти ошибку: cannot convert argument 1 from 'char [100]' to 'char &'
Примерно выглядит так (я просто показал без лишнего текста) void menu(char &amp;name_user, char...

Warring: char * convert to const char * при трансляции
Не подскажет ли кто, как при трансляции на gcc убрать этот warring ? В info-gcc описана куча...

Ошибка Cannot convert a char value to money. The char value has incorrect syntax
В отчете (ниже) появляется ошибка Cannot convert a char value to money. The char value has...

7
2542 / 1201 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
06.11.2014, 23:54 2
Цитата Сообщение от Keter Посмотреть сообщение
в чем различие между char и char*?
char - переменная которая хранит целое число от -128 до 127 диапазон значений
char* - переменная которая хранит адресс, диапазон адресов от 0x0000000 до 0xFFFFFFF
0
С чаем беда...
Эксперт CЭксперт С++
9178 / 4692 / 1273
Регистрация: 18.10.2014
Сообщений: 10,629
07.11.2014, 00:59 3
Лучший ответ Сообщение было отмечено Keter как решение

Решение

Цитата Сообщение от Keter Посмотреть сообщение
Понимаю что проблема в преобразовании данных,
Проблема не в "преобразовании данных", а в неумении объявлять пременные правильного типа.

Судя по коду, идея была в том, чтобы объявить массив символов 4x4. Почему тогда 'TurnBrick' объявлен, как двумерный массив указателей на символы???

C++
1
2
3
4
5
6
7
8
const int sizeTB = 4;
char* TurnBrick[][sizeTB] =
{
    "    ",
    "  0 ",
    " 000",
    "    "
};
Откуда вдруг взялись указатели???

Убираем нафиг указатели и получаем

C++
1
2
3
4
5
6
7
8
const int sizeTB = 4;
char TurnBrick[sizeTB][sizeTB] =
{
    "    ",
    "  0 ",
    " 000",
    "    "
};
Однако это не будет компилироваться в С++ (только в С), так как строковый литерал из четырех символов требует 5 символов для хранения - нужно еще место для нулевого терминального символа.

Поэтому придется сделать либо так

C++
1
2
3
4
5
6
7
8
const int sizeTB = 4;
char TurnBrick[sizeTB][sizeTB + 1] =
{
    "    ",
    "  0 ",
    " 000",
    "    "
};
либо отказаться от строковых литералов

C++
1
2
3
4
5
6
7
8
const int sizeTB = 4;
char TurnBrick[sizeTB][sizeTB] =
{
    ' ', ' ', ' ', ' ',
    ' ', ' ', '0', ' ',
    ' ', '0', '0', '0',
    ' ', ' ', ' ', ' '
};
Всё.

Отдельный вопрос: зачем в начале программы заведена константа 'sizeTB = 4', если дальнейший код ее не использует? Зачем потом в 'main' заведена переменная 'n = 4', которую дальнейший код то использует, то игнорирует? И почему затем в коде местами явно прошивается магическое значение 4? Что это за зоопарк?

Добавлено через 4 минуты
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
char - переменная которая хранит целое число от -128 до 127 диапазон значений
В зависимости от знаковости и размера 'char'. Тип 'char' может быть беззнаковым с диапазоном 0..255. И также состоять более чем из 8 битов с существенно большим диапазоном. Другими словами, диапазон 'char' - от CHAR_MIN до CHAR_MAX. А сколько это - определяется платформой.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
char* - переменная которая хранит адресс, диапазон адресов от 0x0000000 до 0xFFFFFFF
Диапазон адресов зависит от параметров платформы. У меня например - до 0xFFFFFFFFFFFFFFFF

P.S. Что-то у вас F маловато получилось... Точно 7? Что это за платформа такая?
1
6 / 6 / 6
Регистрация: 15.10.2014
Сообщений: 98
07.11.2014, 09:17  [ТС] 4
TheCalligrapher,
Спасибо за подробное описание моей ошибки, теперь я понимаю в чем она!

Я учусь меньше двух месяцев, сейчас пишу тетрис, он уже полностью работает со всем функционалом (правда код корявый, буду править) но поворот фигур у меня сделан путем перестановки каждой координаты каждого вида фигуры. (лишние 260 строчек) поэтому решил попробовать сделать вынос фигуры на отдельный массив, поворот массива и возвращение обратно. Но видимо запутался)
0
6 / 6 / 6
Регистрация: 15.10.2014
Сообщений: 98
07.11.2014, 10:43  [ТС] 5
Это часть программы,начальные координаты x1...y4 могут быть разными (фигура тетриса)

нужно чтобы после поворота массива на 90 градусов старые координаты (по которым расположена фигура) заменялись новыми.

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <stdio.h>
 
using namespace std;
 
    int x1 = 0;
    int z1 = 1;
    int x2 = 1;
    int y2 = 1;
    int x3 = 2;
    int y3 = 1;
    int x4 = 2;
    int y4 = 0;
 
const int sizeTB = 4;
char TurnBrick[sizeTB][sizeTB] =
{
    ' ', ' ', ' ', ' ',
    ' ', ' ', ' ', ' ',
    ' ', ' ', ' ', ' ', 
    ' ', ' ', ' ', ' '
};
    
 
int main()
{
    int i,j;
    int b;
 
    TurnBrick[x1][z1] = 'O';
    TurnBrick[x2][y2] = 'O';
    TurnBrick[x3][y3] = 'O';
    TurnBrick[x4][y4] = 'O';
    
    for (i = 0; i < sizeTB; i++)
    {
        for (j = 0; j < sizeTB; j++)
        {
            cout << TurnBrick[i][j];
        }
        cout << endl;
    };
 
    for (i=0;i<sizeTB/2;i++)
    {
        for (j=i;j<sizeTB-1-i;j++)
        {
            b=TurnBrick[i][j];
            TurnBrick[i][j]=TurnBrick[sizeTB-j-1][i];
            TurnBrick[sizeTB-j-1][i]=TurnBrick[sizeTB-i-1][sizeTB-j-1];
            TurnBrick[sizeTB-i-1][sizeTB-j-1]=TurnBrick[j][sizeTB-i-1];
            TurnBrick[j][sizeTB-i-1]=b;
        }
    };
 
    for (i = 0; i < sizeTB; i++)
    {
        for (j = 0; j < sizeTB; j++)
        {
            cout << TurnBrick[i][j];
        }
        cout << endl;
    };
    return 0;
}
конкретно в данном примере

C++
1
2
3
4
5
6
7
8
int x1 = 0;
    int z1 = 1;
    int x2 = 1;
    int y2 = 1;
    int x3 = 2;
    int y3 = 1;
    int x4 = 2;
    int y4 = 0;
должно стать

C++
1
2
3
4
5
6
7
8
int x1 = 0;
    int z1 = 1;
    int x2 = 1;
    int y2 = 1;
    int x3 = 1;
    int y3 = 2;
    int x4 = 1;
    int y4 = 3;
Как это можно воплотить?
0
Модератор
Эксперт С++
11123 / 9163 / 5504
Регистрация: 18.12.2011
Сообщений: 24,476
07.11.2014, 10:50 6
Цитата Сообщение от Keter Посмотреть сообщение
char* TurnBrick[][sizeTB] =
Уберите звездочку.

Транспонирование матрицы выглядит так:
C++
1
2
3
4
5
6
7
8
9
for (i=0;i<n;i++)
    {
        for (j=i+1;j<n;j++)
        {
            b=TurnBrick[i][j];
            TurnBrick[i][j]=TurnBrick[j][i];
            TurnBrick[j][i]=b;
        }
    }
0
шКодер самоучка
2145 / 1856 / 907
Регистрация: 09.10.2013
Сообщений: 4,055
Записей в блоге: 7
07.11.2014, 11:10 7
Тут нужен временный массив, иначе фигура затирается
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
33
34
35
36
37
38
39
40
// current[size][size] - текущая фигура
//space[width][height] - игровое поле
bool GameLogic::canRotate() {
    color tmp[size][size];
    for(int i = 0; i<size; ++i)
        for(int j=0; j<size; ++j) {
            tmp[j][size-i-1] = current[i][j];
        }
    
    for(int i=0; i<size; ++i)
        for (int j=0; j<size; ++j)
            if(tmp[i][j]!= EMPTY) {
                if(x+i>=width)
                    return false;
                if(x+i<0)
                    return false;
                if(y+j>=height)
                    return false;
                if (y + j < 0)
                    continue;
                if(space[x+i][y+j]!=EMPTY)
                    return false;
            }
    return true;
}
 
void GameLogic::Rotate() {
    color tmp[size][size];
    if(canRotate() == false)
        return;
    for(int i = 0; i<size; ++i)
        for(int j=0; j<size; ++j) {
            tmp[j][size-i-1] = current[i][j];
        }
    
    for(int i = 0; i<size; ++i)
        for(int j=0; j<size; ++j) {
            current[i][j] = tmp[i][j];
        }
}
0
6 / 6 / 6
Регистрация: 15.10.2014
Сообщений: 98
07.11.2014, 11:44  [ТС] 8
Cra3y,
немного не то что нужно было.
Сделал требующееся путем сохранения в дополнительных переменных.
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <iostream>
#include <stdio.h>
 
using namespace std;
 
    int x1 = 0;
    int z1 = 1;
    int x2 = 1;
    int y2 = 1;
    int x3 = 2;
    int y3 = 1;
    int x4 = 2;
    int y4 = 0;
 
const int sizeTB = 4;
char TurnBrick[sizeTB][sizeTB] =
{
    ' ', ' ', ' ', ' ',
    ' ', ' ', ' ', ' ',
    ' ', ' ', ' ', ' ', 
    ' ', ' ', ' ', ' '
};
    
 
int main()
{
    int nx1 = ' ';
    int nx2 = ' ';
    int nx3 = ' ';
    int nx4 = ' ';
    int ny1 = ' ';
    int ny2 = ' ';
    int ny3 = ' ';
    int ny4 = ' ';
    int i,j;
    char b;
 
    
    cout << x1 << endl;
    cout << z1 << endl;
    cout << x2 << endl;
    cout << y2 << endl;
    cout << x3 << endl;
    cout << y3 << endl;
    cout << x4 << endl;
    cout << y4 << endl;
 
    TurnBrick[x1][z1] = 'O';
    TurnBrick[x2][y2] = 'O';
    TurnBrick[x3][y3] = 'O';
    TurnBrick[x4][y4] = 'O';
    
    for (i = 0; i < sizeTB; i++)
    {
        for (j = 0; j < sizeTB; j++)
        {
            cout << TurnBrick[i][j];
        }
        cout << endl;
    };
 
    for (i=0;i<sizeTB/2;i++)
    {
        for (j=i;j<sizeTB-1-i;j++)
        {
            b=TurnBrick[i][j];
            TurnBrick[i][j]=TurnBrick[sizeTB-j-1][i];
            TurnBrick[sizeTB-j-1][i]=TurnBrick[sizeTB-i-1][sizeTB-j-1];
            TurnBrick[sizeTB-i-1][sizeTB-j-1]=TurnBrick[j][sizeTB-i-1];
            TurnBrick[j][sizeTB-i-1]=b;
            
        }
    };
    
    
 
 
    for (i = 0; i < sizeTB; i++)
    {
        for (j = 0; j < sizeTB; j++)
        {
            if (TurnBrick[i][j] == 'O')
            {
                if (nx1 == ' ')
                {
                    nx1 = j;
                    ny1 = sizeTB-i-1;
                }
                else
                {
                    if (nx2 == ' ')
                    {
                        nx2 = j;
                        ny2 = sizeTB-i-1;
                    }
                    else
                    {
                        if (nx3 == ' ')
                        {
                            nx3 = j;
                            ny3 = sizeTB-i-1;
                        }
                        else
                        {
                            if (nx4 == ' ')
                            {
                                nx4 = j;
                                ny4 = sizeTB-i-1;
                            }
                        }
                    }
                }
            }
        }
    };
 
    for (i = 0; i < sizeTB; i++)
    {
        for (j = 0; j < sizeTB; j++)
        {
            cout << TurnBrick[i][j];
        }
        cout << endl;
    };
 
    x1 = nx1;
    cout << x1 << endl;
    z1 = ny1;
    cout << z1 << endl;
    x2 = nx2;
    cout << x2 << endl;
    y2 = ny2;
    cout << y2 << endl;
    x3 = nx3;
    cout << x3 << endl;
    y3 = ny3;
    cout << y3 << endl;
    x4 = nx4;
    cout << x4 << endl;
    y4 = ny4;
    cout << y4 << endl;
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.11.2014, 11:44

выдает ошибку :[C++ Error] Unit1.cpp(30): E2034 Cannot convert 'char' to 'char *' не понимаю в чем дело
//Дано предложение. Найти наибольшее количество идущих подряд пробелов #include &lt;vcl.h&gt;...

Вылезает C2440: '=' : cannot convert from 'const char [7]' to 'char'
В коде есть строки и им нужно присвоить значение, через обычное = вылезает C2440: '=' : cannot...

DLL, ошибка Cannot convert 'char *' to 'char'
подключал dll по примеру https://www.cyberforum.ru/cpp-builder/thread154847.html // определяем тип...

ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*')
int main() { string fileName, currWord, currMax = &quot;&quot;; cin&gt;&gt;fileName; ...

E2034 Cannot convert 'char' to 'char *'
Добрый день всем! Помогите плз исправить ошибку. Не понимаю чего она происходит. Вообщем, нужно все...

Cannot convert parameter 1 from 'char' to 'char []'
#include &lt;iostream&gt; using namespace std; const int MAX=20; class base { public: virtual...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.