Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
#1

Феномен в одном месте в другом нет - C++

13.08.2010, 22:11. Просмотров 530. Ответов 8
Метки нет (Все метки)

В комментариях все написано запустите прогу и увидете. Почему так? И как исправить?

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
#include <iostream>
using namespace std;
 
int kol(int i);
char *prech(int t);
char po(int s);
 
int main(){
  char *ch;
  ch = prech(456);
 // cout << ch; когда вывожу не выводит 456 почему?
  return 0;
};
 
 
int kol(int i) {
  int z;
  for(z = 1; i;i--) z *= 10;
  return z;
}
 
char *prech(int t) {
  char m2[10];
  int i,z,r,m1[10];
  for(i = 0, z = t; z; i++) {
    z = z / 10;
  }
  r = i;
  if(i == 1) {
    m1[0] = (double) t / 10 * 10;
    goto poka;
  }
  else i--;
  for(z = 0; i; i--,z++) {
    m1[z] = t / kol(i);
    t = t - m1[z] * kol(i);
    if(i == 1) m1[z+1] = t;
  }
  poka:
  for(z = 0; z < r; z++)
    m2[z] = po(m1[z]);
  m2[z] = '\0';
  cout << (char *)m2; // А сдесь выводит.
  return m2;
}
 
char po(int s) {
  switch(s) {
    case 0: return '0';
    case 1: return '1';
    case 2: return '2';
    case 3: return '3';
    case 4: return '4';
    case 5: return '5';
    case 6: return '6';
    case 7: return '7';
    case 8: return '8';
    case 9: return '9';
  } 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2010, 22:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Феномен в одном месте в другом нет (C++):

Код в одном проекте работает, в другом нет - C++
Добрый вечер.у меня возникла такая проблема:я писала функцию по удалению оценок в одном проекте (пишу на Visual Studio 2012),а вся...

Код не выполняется в одном месте, но выполняется в другом - C++
Вот код процедуры: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; ...

Программа со строками, в одном виде работает, в другом нет - C++
Написал программу #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main(int argc, char*...

При одном кострукторе вызывется деструктор, при другом нет - почему? - C++
Есть класс дерево, в нём вложен класс лист. В подклассе лист есть два конструктора: Node(int key, Node NIL) и Node() #include &lt;iostream&gt;...

Сборка проекта, объявление и инициализация конструкторов в одном месте - C++
Всем привет! Столкнулся с такой проблемой как &quot;много файловая&quot; программа. А именно если конструктор и диструктор описывать например в A.h...

Почему в одном случае y=0, в другом - y=1 ? - C++
#include &lt;iostream&gt; using namespace std; int main(int argc, char** argv) { int y; cout &lt;&lt; y; return 0; } Я так понимаю,...

8
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
13.08.2010, 22:23 #2
Бред оО. Возвращает верно. До вывода ch=456...
0
ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
13.08.2010, 22:26  [ТС] #3
А после вывода почему не выводит? В главной проге ты коммент сними.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
13.08.2010, 22:37 #4
Выводит все как надо. В функции возвращался адрес, а не значение

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>
using namespace std;
 
int kol(int i);
char *prech(int t);
char po(int s);
 
int main(){
  char *ch;
  ch = prech(456);
  while(*ch)
  {
   cout << *ch;
   ch++;
  }//когда вывожу не выводит 456 почему?
  return 0;
};
 
 
int kol(int i) {
  int z;
  for(z = 1; i;i--) z *= 10;
  return z;
}
 
char *prech(int t) {
  char*m2;
  m2=new char[10];
  int i,z,r,m1[10];
  for(i = 0, z = t; z; i++) {
    z = z / 10;
  }
  r = i;
  if(i == 1) {
        m1[0] = (double) t / 10 * 10;
        goto poka;
  }
  else i--;
  for(z = 0; i; i--,z++) {
        m1[z] = t / kol(i);
    t = t - m1[z] * kol(i);
        if(i == 1) m1[z+1] = t;
  }
  poka:
  for(z = 0; z < r; z++)
    m2[z] = po(m1[z]);
  m2[z] = '\0';
  cout << m2 <<'\n'; // А сдесь выводит.
  return m2;
}
 
char po(int s) {
  switch(s) {
    case 0: return '0';
    case 1: return '1';
    case 2: return '2';
    case 3: return '3';
        case 4: return '4';
    case 5: return '5';
    case 6: return '6';
    case 7: return '7';
    case 8: return '8';
    case 9: return '9';
  } 
}
В main можно и так:

C++
1
2
3
4
5
6
int main(){
  char *ch;
  ch = prech(456);
  std::cout<< ch <<'\n'; 
  return 0;
};
0
ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
13.08.2010, 22:43  [ТС] #5
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
 
int main() { 
  char op[3] = "456";
  char * l = op;
  cout << l; //Cдесь же не адрес же выводится а строка
 return 0;
}
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
13.08.2010, 22:47 #6
ElvenDragon, Во первых char op[3]="456" некорректно. Должно быть char op[4]="456"
А во вторых выводит все верно, если учитывать что op[4], ибо '\0' должен быть последним символом
1
ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
13.08.2010, 22:57  [ТС] #7
ch = prech(456); //сдесь возращается массив на 1 элемент тоесть адрес его.

char op[3] = "456";
char * l = op; // тоже самое что выше адрес присваевается.
Разницы нету.
Но тут чет выводит а там нет. Какойто бред.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
13.08.2010, 23:01 #8
ElvenDragon, Скорее даже не так... Тут присваивается указателю на char адрес первого элемента. А там в функции: строка является локальным объектом. Удаляется сразу после выхода из функции. Если же объявить m как указатель - он будет существовать, до применения оператора delete.
0
kazak
3048 / 2369 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
14.08.2010, 04:02 #9
ElvenDragon, ни какого феномена нет, ты объявляешь в функции prech массив m2 и пытаешься вернуть его из функции, но m2 является локальным объектом функции и будет уничтожен по ее завершении. Перечитай про области видимости и время жизни переменных.
0
14.08.2010, 04:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2010, 04:02
Привет! Вот еще темы с ответами:

Перегрузка оператора индексации в одном классе и использование в другом - C++
Вообщем проблема состоит в том, что не понимаю как это сделать. Есть класс Document в нем есть вектор vec состоящий из Item'ов. В классе...

Формирование слова из заданных символов в одном массиве и их номеров в другом - C++
У меня есть два массива int x={ 20 , 28, 1, 12, 9, 60, 24, 13 } и символьный массив char*xbuk={ &quot;р&quot;, &quot;е&quot;, &quot;у&quot; ,&quot;в&quot;, &quot;и&quot; ,&quot;т&quot;, &quot;п&quot;, &quot;с&quot;...

20 цифр и букв, выводятся 2 столбца, в одном буквы, в другом цифры - C++
20 цифр и букв, выводятся 2 столбца, в одном буквы, в другом цифры код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using...

Вычесть два массива, если в одном массиве больше элементов, чем в другом - C++
Здраствуйте! Сижу изучаю одномерные массивы, но зашел в тупик на счет вычитания массивов... Для вас это конечно просто, но я чего-то не...


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

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

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