Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
ElvenDragon
 Аватар для ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
13.08.2010, 22:11     Феномен в одном месте в другом нет #1
В комментариях все написано запустите прогу и увидете. Почему так? И как исправить?

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';
  } 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2010, 22:11     Феномен в одном месте в другом нет
Посмотрите здесь:

Сборка проекта, объявление и инициализация конструкторов в одном месте C++
C++ Код не выполняется в одном месте, но выполняется в другом
код в одном проекте работает,в другом нет C++
Перегрузка оператора индексации в одном классе и использование в другом C++
C++ 20 цифр и букв, выводятся 2 столбца, в одном буквы, в другом цифры
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.08.2010, 22:23     Феномен в одном месте в другом нет #2
Бред оО. Возвращает верно. До вывода ch=456...
ElvenDragon
 Аватар для ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
13.08.2010, 22:26  [ТС]     Феномен в одном месте в другом нет #3
А после вывода почему не выводит? В главной проге ты коммент сними.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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;
};
ElvenDragon
 Аватар для 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;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.08.2010, 22:47     Феномен в одном месте в другом нет #6
ElvenDragon, Во первых char op[3]="456" некорректно. Должно быть char op[4]="456"
А во вторых выводит все верно, если учитывать что op[4], ибо '\0' должен быть последним символом
ElvenDragon
 Аватар для 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; // тоже самое что выше адрес присваевается.
Разницы нету.
Но тут чет выводит а там нет. Какойто бред.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.08.2010, 23:01     Феномен в одном месте в другом нет #8
ElvenDragon, Скорее даже не так... Тут присваивается указателю на char адрес первого элемента. А там в функции: строка является локальным объектом. Удаляется сразу после выхода из функции. Если же объявить m как указатель - он будет существовать, до применения оператора delete.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2010, 04:02     Феномен в одном месте в другом нет
Еще ссылки по теме:

При одном кострукторе вызывется деструктор, при другом нет - почему? C++
Почему в одном случае y=0, в другом - y=1 ? C++
Формирование слова из заданных символов в одном массиве и их номеров в другом C++

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

Или воспользуйтесь поиском по форуму:
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
14.08.2010, 04:02     Феномен в одном месте в другом нет #9
ElvenDragon, ни какого феномена нет, ты объявляешь в функции prech массив m2 и пытаешься вернуть его из функции, но m2 является локальным объектом функции и будет уничтожен по ее завершении. Перечитай про области видимости и время жизни переменных.
Yandex
Объявления
14.08.2010, 04:02     Феномен в одном месте в другом нет
Ответ Создать тему
Опции темы

Текущее время: 17:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru