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

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

06.11.2014, 23:48. Показов 1833. Ответов 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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.11.2014, 23:48
Ответы с готовыми решениями:

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

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

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

7
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
06.11.2014, 23:54
Цитата Сообщение от Keter Посмотреть сообщение
в чем различие между char и char*?
char - переменная которая хранит целое число от -128 до 127 диапазон значений
char* - переменная которая хранит адресс, диапазон адресов от 0x0000000 до 0xFFFFFFF
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,227
07.11.2014, 00:59
Лучший ответ Сообщение было отмечено 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  [ТС]
TheCalligrapher,
Спасибо за подробное описание моей ошибки, теперь я понимаю в чем она!

Я учусь меньше двух месяцев, сейчас пишу тетрис, он уже полностью работает со всем функционалом (правда код корявый, буду править) но поворот фигур у меня сделан путем перестановки каждой координаты каждого вида фигуры. (лишние 260 строчек) поэтому решил попробовать сделать вынос фигуры на отдельный массив, поворот массива и возвращение обратно. Но видимо запутался)
0
6 / 6 / 6
Регистрация: 15.10.2014
Сообщений: 98
07.11.2014, 10:43  [ТС]
Это часть программы,начальные координаты 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
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
07.11.2014, 10:50
Цитата Сообщение от 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
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
07.11.2014, 11:10
Тут нужен временный массив, иначе фигура затирается
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  [ТС]
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.11.2014, 11:44
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru