Задавайте вопросы, мы ответим
Вы не зашли.
paulus написал:
Ох. Срочно сотрите, чтобы это никто не видел
Поздно! Трое подсудимых уже сознались! :-)
fox, прочитайте внимательно http://forum.sources.ru/index.php?s=7c7 … opic=98941
Почему ошибка возникает именно на третьей фазе - прямого ответа на этот вопроса нет - поскольку при неправильной работе с памятью может происходить много нехорошего, при этом ошибка сегментации - это один из самых удачных вариантов.
В дополнение к замечаниям Paulusa хочу привести пример того, как это должно выглядеть (чистый c, без примесей).
(Если пишете на c++, то используйте соответствующие обертки для строк - например объекты типа std::string, тогда как
минимум не будет таких проблем с выделением памяти.)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
char* showtime(char* szBuffer,int nLength,char a)
{
time_t seconds;
struct tm* timeinfo;
seconds=time(NULL);
timeinfo = localtime(&seconds);
switch(a)
{
case 'f':
{
strftime(szBuffer,nLength,"%A, %B %d, %Y %H:%M:%S", timeinfo);
break;
}
case 's':
{
strftime(szBuffer,nLength,"%X",timeinfo);
break;
}
case 'k':
{
strftime(szBuffer,nLength,"%Y",timeinfo);
break;
}
default:
szBuffer[0]='\0';
break;
}
return szBuffer;
}
int main(void)
{
char szBuffer[120];
printf("%s\n",showtime(szBuffer,sizeof(szBuffer),'f'));
printf("%s\n",showtime(szBuffer,sizeof(szBuffer),'s'));
printf("%s\n",showtime(szBuffer,sizeof(szBuffer),'k'));
return 0;
}
Неактивен
Какой прикольный форум. Не ожидал, что столько народу не понимают, что если
объект удален, то им пользоваться нельзя
Неактивен
Спасибо Вам огромное!
Извините, что нарушил красоту форума, но мне это кровь из носа нужно было
Возврощать функцию мне в любом случаи надо, я написал как бы функцию времени, то-есть хочу написать, потому, что в моей программе часто нужно полуать время разного формата!
Теперь по возвращению char массива, я прочёл форум спасибо, но я понимаю что я наверное самый тупой, у меня голова кругом идёт я так и не понял как правельно вернуть чар из функции? Пожалуйста покажите живой пример...
То что в указателях я баран это факт и покрашить память можно без вариантов тоже факт, по этому тренируюсь я на кошках сервер на виртуальной машине за него не страшно... Книжку я читал вродибы внимательно и вродебы всё было понятно до начала практики, а вот как началась практика отсутсвие опыто дало знать(((
И снова вопрос совмещения двух языков, если восном программа пишется на C++ и в ней встречаются элементы С это смертельно или пойдёт, тоесть можно так делать? Вы уже отвечали мне на этот вопрос но вот я снова колеблюсь после последних постов...
Спасибо!
Неактивен
И ещё вопросик, а почему вы пишите константу перед чаром?
Неактивен
Вы пишете программу на С и в ней встречаются элементы С++. Это будет более
близко к действительности
Возвращать char* не надо. Желательно никогда. Просто чтобы не ошибиться.
Тем более, пока Вы сомневаетесь. Выбросьте свою книгу. Возьмите Страуструпа.
Прочитайте. Осознайте. Прочитайте еще раз. Осознайте еще раз. Садитесь и
пишите на С++ Либо возьмите хорошую книжку по С, свыкнитесь с мыслью,
что С++ нет, и пишите на нем. Это тоже не очень тяжело.
Есть два относительно безопасных способа вернуть char*. Первый описал уже
в своем примере deadka:
Неактивен
Возвращать char*, на массив, который Вы создали в функции в-общем случае нельзя (если дополнительных трюков типа static не творить), да и не нужно это вовсе.
Не пойму, чем Вам не подходит тот вариант, который я привел постом выше? Туда передается строка извне, в функции она принимает нужный вид, она же и возвращается. Если нужно время другого формата - добавьте еще одно условие в switch.
Практически в программах на c++, конечно, часто встречаются элементы, написанные на c, в конце-концов за мелкими исключениями любая программа, написанная на c соберется компилятор c++. Идеологически этого стоит избегать, но практически избежать не всегда просто, иногда удобнее сделать вставку на c, все зависит от ситуации. Решайте задачу на том языке, на котором проще ее решить.
Неактивен
Похоже у нас с Paulus'ом гонка потоков ), я исчезаю как минимум на 10 дней.
2 fox: Касательно языков программирования - действительно, если начинаете разбирать язык, то лучше начинайте с одного, без перекрещиваний.
Сугубое ИМХО (а точнее совет, о котором не просили): отложите пока Страуструпа, берите хороший учебник по C, и пишите только на чистом C. Забудьте про расширение cpp у файлов ваших исходников, забудьте про g++, компилируйте только на gcc и cc.
Когда освоитесь, тогда и решите, надо ли Вам осваивать c++ - это слишком от много зависит, в частности от задач, которые Вы решаете.
Неактивен
Я не говрю, что не потходит я пытаюсь понять принцип!
Значит писать чисто теоретически можно как угодно смешивая языки, но компелить G++ тоесть с++, но не совем как угодно ну не страшно смешивание... Ну вот Страуструпа негде нет, решено куплю в интрент магазине!
Судя по последнему посту есть смысел на время забыть C++
Проэкзаменируйте мои знания, я написал две тестовые програмки как возрощать char я правельно всё сделал, оцените?
Неактивен
И ещё можно глупый вопрос?
А какая программа будет производительней на C или на С++ примерно одинаково написанная только используя разные синтаксисы языков?
Неактивен
Огромное спасибо, за помощь вы мне многое прояснили!
Только теперь ещё больше информации для размышления по поводу С без С++...
Неактивен
А такой вариант тоже правельный с точки зрения С?
Неактивен
Пользуйтесь strncpy: strcpy содержит потенциальные переполнения.
Неактивен