• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Помогите найти ошибку

  • Автор темы 9a9z9a
  • Дата начала
9

9a9z9a

Задача состоит в нахождении количества чисел-палиндромов
Вот мой код, он запускается, но нечего не показывает :)

C++:
#include <iostream>
using namespace std;
bool for_pal(int arr[], int sz) // функция для проверки является ли число палиндромом
{
int f;
for(f = 0; f < (sz / 2); f++) 
{
if(arr[f] == arr[sz - 1 - f])continue;
return false;
}
return true;
}
void main()
{
setlocale(LC_ALL, "Rus");
int *arr, kol_vo = 0, sz, g = 0;
int i,j;
int matrix[2][2] = {{777, 404}, {1991, -2091}};
for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++) 
{
sz = 0; //начальный размер динамического массива(а так вообще можно? :ya_lamo: )
//пробывал с 1 , та же лажа
arr = new int[sz]; // создаем динамический массив, в который заносим цифры элемента matrix[i][j]
if(!arr) {cout<<"LOL!\n"; return;}
while(matrix[i][j]) //заносит цифры в динамический массив
{
sz++;
arr[g++] = (matrix[i][j] % 10); 
matrix[i][j] /= 10;
}

if(for_pal(arr, sz) == true) kol_vo++; //проверка числа на палиндром

delete[]arr; //удаление динамического массива для создание нового(пустого) для следующего эл-та matrix[i][j]
}
cout<<"Количество чисел-палиндромов : "<<kol_vo<<endl;
}

В любом случае должно выводить хотябы 0, но не выводит нечего.
 
R

Rififi

solova

загоните свой код в компилятор и посчитайте ошибки

загнал, посчитал.
ошибок ноль. o_0

C++:
#include <stdio.h>

volatile int g_size = 10;

int get_size()
{
return g_size;
}

int main()
{
int size = get_size();
int arr[size];

printf("array size: %d", sizeof(arr) / sizeof(arr[0]));

return 0;
}




dreamer

А поскольку size у Вас определяется в коде, компилятор не будет знать, насколько уменьшить указатель стека.

зако в момент аллокации значение size прекрасно известно

а теперь внимание - волшебные пузырьки!

sub esp, [size]
 
S

solova

Rififi
загнал, посчитал.
ошибок ноль. o_0

то же что и "2+2=4, а почему? а потому что если (2*10+15)/5 будет равно 7, а 7-3=4. это же так просто"
ну намудрил .
А вот теперь внимание - волшебные пузырьки!
вы размер массива программно задаёте "10"(статический)
равносильно что написать
C++:
int g_size = 10;
int arr[g_size];
вы хоть поняли о чём разговор был?

в вашем случае при инициализации массива говорится что его размер является результатом функции "get_size()" и результат УЖЕ равен значению "g_size" который так же известен и равен "10", выглядит это так size=get_size()=g_size=10;

а теперь пузырьки
допустим массив должен быть равен количеству файлов в определённой директории
и количество файлов будет известно после выполнения кода, но перед выполнением кода происходит инициализация(выделение памяти и занесение значений если есть) всех переменных в том числе и массивов .
результат: код не выполнен=> количество файлов не известно =>размер неизвестен=> инициализировать (выделить память под)массив нельзя


ierofant учи основы
 
L

lazybiz

Я извиняюсь что вмешиваюсь, но по-моему ierofant основы знает намного лучше чем ты. Именно поэтому он участник C/C++ Team и имеет +8 репы.
 
D

dreamer

ierofant
Вы знаете отличие статического массива от динамического? Вот что получается при компиляции этой ерунды, которую вы написали и упорно защищаете: (Rififi, спасибо за линк).

Rififi
Вы, по-моему, не тот код скомпилировали, на который solova дал свой комментарий.

lazybiz
Оно и видно :)
 
9

9a9z9a

Ребята, я вижу этоn вопрос о массивах уже принципиален :)
Почему функция atoi(char*) из stdlib.h не работает в VS 2008 ? :)

C++:
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
void main()
{  
char S[] = {10, 13, 15};
char *tmp = "";
*tmp = S[0];
int p;
p = atoi(tmp);
cout<<p<<endl;
}
 
S

solova

lazybiz но ведь он ошибся в 9-ом сообщении и продолжал настаивать на своей правоте не смотря на Сообщение #16
 
L

lazybiz

solova
Давай начнем с того что я не говорил что он не ошибался. Ты можешь мне указать на его ошибку?
 
S

solova

error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2133: 'mas' : unknown size

и сообщение 12
и сообщение 15
 
L

lazybiz

А вот это какой по вашему массив тогда:
C++:
int size;
std::cout <<"Введите размер массива: " << std::endl;
std::cin >> size;
int mas [size];
Как я понял ты именно это имел в виду.
Возможно ты не в курсе, но есть такое выражение "взять на понт", и, судя по всему из твоего следующего выражения он тебя взял...
...
в корне неверная инициализация, именно для подобных случаев нужны динамические.
загоните свой код в компилятор и посчитайте ошибки...
Могу поспорить, что для того чтобы убедиться в том, что этот код не правильный ты сначала загнал его в компилятор, а уже потом в этом убедился, т.е. изначально ты этого не знал!)

Но больше всего меня порадовало вот это:
"new" выделяет адресное пространство вне адресного пространства
)))я недавно смотрел фильм "Начало", так вот там был сон внутри сна, по-моему это именно то о чем вы говорите)))))
 
R

Rififi

solova

в вашем случае при инициализации массива говорится что его размер является результатом функции "get_size()" и результат УЖЕ равен значению "g_size" который так же известен и равен "10", выглядит это так size=get_size()=g_size=10;

А теперь усложняем пример :sam_takoi:

C++:
#include <stdio.h>

int main()
{
int size = rand() % 10 + 1;
int arr[size];

printf("array size: %d", sizeof(arr) / sizeof(arr[0]));

return 0;
}



вывод = 4 (seed один и тот же)

для просветления читайте доки - они рулез.
например фак на комо:


допустим массив должен быть равен количеству файлов в определённой директории
и количество файлов будет известно после выполнения кода, но перед выполнением кода происходит инициализация(выделение памяти и занесение значений если есть) всех переменных в том числе и массивов .
результат: код не выполнен=> количество файлов не известно =>размер неизвестен=> инициализировать (выделить память под)массив нельзя


о чём здесь, я не понял.

dreamer

Вы, по-моему, не тот код скомпилировали, на который solova дал свой комментарий.

на codepad,е запрещен ввод из потока cin, а так никакой разницы нет.
 
9

9a9z9a

Потому что ты передаешь в нее не строку, а некоторую (возможно даже безконечную) последовательность, которая начинается со значения 10.

Да, там была ошибка, но даже такое вот изменение
char S[10] = "1234567";
Всё равно не запускается . А вот в Borland 3.1 запускается. Как быть с VS 2008? <-- Неужели в ней тоже самое что и с pow и sqrt из math.h ?
 
D

dreamer

Rififi
Вы ой как слукавили. Натравите на этот код компилятор C++ и получите это:
 
R

Rififi

dreamer

Натравите на этот код компилятор C++ и получите это

Для чего? Можно и питон на исходник натравить, и брейнфак ((((((Ж
к иллюстрации работы программы это отношения не имеет никакого.
 
D

dreamer

А, значит, по-вашему, std, cin и cout из того перла г-на ierofant пришли из языка С, а не C++?

Жму руку обоим, из темы удаляюсь: демагогствуйте на здоровье.
 
I

ierofant

error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2133: 'mas' : unknown size
Компилятор gcc-4.5 не выдаёт никаких ошибок, на этот код. Я не виноват, что ваши компиляторы стары, они действительно не могли делать такое. Специально проверил несколько разных компиляторов.

- вот здесь первый пример посмотрите. И вообще прочтите статью.

ierofant учи основы
solova, я хорошо знаю основы. Я не какой-нибудь студент, я работаю в серьёзной организации и привык отвечать за свой код.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!