SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#26 01.07.2010 00:29:46

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: C++ open

paulus написал:

Ох. Срочно сотрите, чтобы это никто не видел smile

Поздно! Трое подсудимых уже сознались! :-)

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;
}


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#27 01.07.2010 00:39:19

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: C++ open

Какой прикольный форум. Не ожидал, что столько народу не понимают, что если
объект удален, то им пользоваться нельзя sad

Неактивен

 

#28 01.07.2010 00:48:32

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: C++ open

Спасибо Вам огромное!
Извините, что нарушил красоту форума, но мне это кровь из носа нужно было smile
Возврощать функцию мне в любом случаи надо, я написал как бы функцию времени, то-есть хочу написать, потому, что в моей программе часто нужно полуать время разного формата!
Теперь по возвращению char массива, я прочёл форум спасибо, но я понимаю что я наверное самый тупой, у меня голова кругом идёт я так и не понял как правельно вернуть чар из функции? Пожалуйста покажите живой пример...
То что в указателях я баран это факт и покрашить память можно без вариантов тоже факт, по этому тренируюсь я на кошках сервер на виртуальной машине за него не страшно... Книжку я читал вродибы внимательно и вродебы всё было понятно до начала практики, а вот как началась практика отсутсвие опыто дало знать(((
И снова вопрос совмещения двух языков, если восном программа пишется на C++ и в ней встречаются элементы С это смертельно или пойдёт, тоесть можно так делать? Вы уже отвечали мне на этот вопрос но вот я снова колеблюсь после последних постов...
Спасибо!

Неактивен

 

#29 01.07.2010 00:56:53

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: C++ open

И ещё вопросик, а почему вы пишите константу перед чаром?

Неактивен

 

#30 01.07.2010 00:56:57

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: C++ open

Вы пишете программу на С и в ней встречаются элементы С++. Это будет более
близко к действительности wink

Возвращать char* не надо. Желательно никогда. Просто чтобы не ошибиться.
Тем более, пока Вы сомневаетесь. Выбросьте свою книгу. Возьмите Страуструпа.
Прочитайте. Осознайте. Прочитайте еще раз. Осознайте еще раз. Садитесь и
пишите на С++ smile Либо возьмите хорошую книжку по С, свыкнитесь с мыслью,
что С++ нет, и пишите на нем. Это тоже не очень тяжело.

Есть два относительно безопасных способа вернуть char*. Первый описал уже
в своем примере deadka:

char* name(char* in)
{
    // какие-то действия
    return in; // возвращается не новая строка, а in!
}


Второй неплохой способ — это возвращать ссылку на глобальный объект:
char somestring[100];
char* name ()
{
    // какие-то действия
    return somestring;
}


UPD: А const я пишу потому что не изменяю в функции этот параметр smile В С это
желательно (тем более, что тогда компилятор дополнительно может меня проверить),
в С++ — обязательная штука (и тут уже играет роль привычка wink ).

Неактивен

 

#31 01.07.2010 00:57:32

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: C++ open

Возвращать char*, на массив, который Вы создали в функции в-общем случае нельзя (если дополнительных трюков типа static не творить), да и не нужно это вовсе.

Не пойму, чем Вам не подходит тот вариант, который я привел постом выше? Туда передается строка извне, в функции она принимает нужный вид, она же и возвращается. Если нужно время другого формата - добавьте еще одно условие в switch.

Практически в программах на c++, конечно, часто встречаются элементы, написанные на c, в конце-концов за мелкими исключениями любая программа, написанная на c соберется компилятор c++. Идеологически этого стоит избегать, но практически избежать не всегда просто, иногда удобнее сделать вставку на c, все зависит от ситуации. Решайте задачу на том языке, на котором проще ее решить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#32 01.07.2010 01:04:55

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: C++ open

Похоже у нас с Paulus'ом гонка потоков ), я исчезаю как минимум на 10 дней.

2 fox: Касательно языков программирования - действительно, если начинаете разбирать язык, то лучше начинайте с одного, без перекрещиваний.

Сугубое ИМХО (а точнее совет, о котором не просили): отложите пока Страуструпа, берите хороший учебник по C, и пишите только на чистом C. Забудьте про расширение cpp у файлов ваших исходников, забудьте про g++, компилируйте только на gcc и cc.
Когда освоитесь, тогда и решите, надо ли Вам осваивать c++ - это слишком от много зависит, в частности от задач, которые Вы решаете.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#33 01.07.2010 01:41:13

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: C++ open

Я не говрю, что не потходит я пытаюсь понять принцип!
Значит писать чисто теоретически можно как угодно смешивая языки, но компелить G++ тоесть с++, но не совем как угодно ну не страшно смешивание... Ну вот Страуструпа негде нет, решено куплю в интрент магазине!
Судя по последнему посту есть смысел на время забыть C++ smile
Проэкзаменируйте мои знания, я написал две тестовые програмки как возрощать char я правельно всё сделал, оцените?


[root@BSD /home/fox/wrk/tmp2]# cat test.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char buff[128];

char* inout(char* tm)
{
strcpy(buff,tm);
return buff;
}

int main()
{
printf("WELCOME!\n");

char tmp[]="Test...";

printf("Возврат: %s\n",inout(tmp));

return 0;
}

 

Первый способ с глобальной переменной...
Второй:

[root@BSD /home/fox/wrk/tmp2]# cat ./test2.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* inout(char* tm)
{
return tm;
}

int main()
{
printf("WELCOME!\n");

char tmp[]="Test2...";

printf("Вывод: %s\n",inout(tmp));

return 0;
}

 

Но во втором случае я немогу проводить не каких действий по записи с переменной tm, она просто зашла и вышла...
Надо ещё потринероватся...
Константа пишется перед теми переменными которые не меняются на протяжении всей своей жизни верно я понял?
А как массив char стереть, были данные а потом взять и их всех под ноль, что бы потом новые записать...

Неактивен

 

#34 01.07.2010 01:50:52

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: C++ open

И ещё можно глупый вопрос?
А какая программа будет производительней на C или на С++ примерно одинаково написанная только используя разные синтаксисы языков?

Неактивен

 

#35 01.07.2010 02:28:49

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: C++ open

Огромное спасибо, за помощь вы мне многое прояснили!
Только теперь ещё больше информации для размышления по поводу С без С++...

Неактивен

 

#36 01.07.2010 03:28:49

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: C++ open

А такой вариант тоже правельный с точки зрения С?


char* show(char* a)
{
static char t[128];
strcpy(t,a);
return(t);
}

int main()
{
char z[128]="fortero";

printf("%s\n",show(z));

}
 

У меня лёгкое помешательство... Теперь вот как вы написали в одном посту что не понимаете как может жить переменная когда функция с ней уже не существует, я начинаю осозновать смысел передачь, что то в голове проясняется...
Ещё раз спасибо, что вкладываете знания в мою голову, ибо как сказал товарищь Кастанеда самое сложное что нам даётся это знания!!!

Неактивен

 

#37 01.07.2010 11:52:41

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: C++ open

Пользуйтесь strncpy: strcpy содержит потенциальные переполнения.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson