Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 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. Показов 1800. Ответов 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
12927 / 6795 / 1819
Регистрация: 18.10.2014
Сообщений: 17,193
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
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,238
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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru