Вопрос по C++

Для тех, кто хочет сделать мир лучше.
Сообщение
Автор
Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#46 Сообщение 16.09.2010, 20:01

Ох.. переходить к графике, не выучив языка..
Прозреваю кривые, но побрякушестые приложения в скором будущем.
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Аватара пользователя
GanGSISoft
Полковник
Полковник
Сообщения: 1430
Зарегистрирован: 27.03.2008
Откуда: Бацькаўшчына
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

#47 Сообщение 16.09.2010, 20:25

NiGHt-LEshiY
Не волнуйся, ты и остальные их не увидите.
Просто хочу попробовать, кое чего сделать для себя, а там со временем и опыт, и знания придут. И тогда и со всем своим опытом и знаниями, накопленными годами, сделаю графическое приложение, и покажу общественности. :-)

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#48 Сообщение 16.09.2010, 20:47

GanGSISoft
Лучше сделай консольное.. Так больше народу сможет его использовать.
И выложи под GPL или BSD.
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Аватара пользователя
GanGSISoft
Полковник
Полковник
Сообщения: 1430
Зарегистрирован: 27.03.2008
Откуда: Бацькаўшчына
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

#49 Сообщение 16.09.2010, 21:23

NiGHt-LEshiY
шо? я просто пошутил, ничего глобального на много лет не замыслил(просто очередная бесполезная побрикушка для себя, которая поможет мне лучше освоить C++), просто хочу знать, есть ли там canvas или что-то подобное, или как то по другому можно рисовать.

Добавлено спустя 29 минут 45 секунд:
Вроде рахобрался, но вот уже общий вопрос по C
Объявил переменную System::Drawing::Rectangle a;, она составная,(ещё вопрос правильно ли я её объявил)
как мне изменить её характеристики, Код
a::top
a->top
выдаёт ошибку

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#50 Сообщение 16.09.2010, 21:25

Ты целиком код дай. Объявление, присваивание... Всё-всё.
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Аватара пользователя
GanGSISoft
Полковник
Полковник
Сообщения: 1430
Зарегистрирован: 27.03.2008
Откуда: Бацькаўшчына
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

#51 Сообщение 16.09.2010, 21:34

Код: Выделить всё

System::Drawing::Bitmap ^bmp;//тут кстати тоже сомневаюсь что правильно, без знака ^ не компилировалось, new, gcnew тоже не работает
//----- тут будте загрузка изображения в переменную, или генерация его в программе
System::Drawing::Rectangle a;

//Ни одно из 3-х не работает.
a::Top=1;
a->Top=1;
a.Top=1;

Form1::pictureBox1->DrawToBitmap(bmp,a);
Последний раз редактировалось GanGSISoft 16.09.2010, 21:37, всего редактировалось 1 раз.

Lev2008
Лейтенант
Лейтенант
Сообщения: 221
Зарегистрирован: 08.11.2008

#52 Сообщение 16.09.2010, 22:09

Из мсдн:

Код: Выделить всё

private:
   Bitmap^ image1;
   void Button1_Click( System::Object^ /*sender*/, System::EventArgs^ /*e*/ )
   {
      try
      {
         // Retrieve the image.
         image1 = gcnew Bitmap( "C:\\Documents and Settings\\All Users\\"
         "Documents\\My Music\\music.bmp",true );
         int x;
         int y;
         // Loop through the images pixels to reset color.
         for ( x = 0; x < image1->Width; x++ )
         {
            for ( y = 0; y < image1->Height; y++ )
            {
               Color pixelColor = image1->GetPixel( x, y );
               Color newColor = Color::FromArgb( pixelColor.R, 0, 0 );
               image1->SetPixel( x, y, newColor );

            }
         }
         // Set the PictureBox to display the image.
         PictureBox1->Image = image1;
         // Display the pixel format in Label1.
         Label1->Text = String::Format( "Pixel format: {0}", image1->PixelFormat );
      }
      catch ( ArgumentException^ ) 
      {
         MessageBox::Show( "There was an error."
         "Check the path to the image file." );
      }
   }
может чем поможет.
Хотя, имхо, если уж писать на C++, то тогда смысл использовать .NET классы? Используй WinAPI.
А если хочется .NET, то лучше на C# - он более понятно устроен (тоже имхо).

Аватара пользователя
GanGSISoft
Полковник
Полковник
Сообщения: 1430
Зарегистрирован: 27.03.2008
Откуда: Бацькаўшчына
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

#53 Сообщение 18.09.2010, 22:59

Lev2008
Спасибо может и поможет. И как использовать API для этого?

Еще вопрос. В совсем простой программе функции написаные мной работают нормально. А вот в более сложной вылетают. Если переменную объявить как char *s=new char; то вылетает при объявлении, если через char s[200] то всё нормально. Вылетает еще на закрытии файла. И пишет что неверный указатель 0хсссссс...
Я так понял что у меня что то с памятью в программе, всякие надо наверное применять memset и malloc, вот только где и как не знаю. И что еще делать.

Lev2008
Лейтенант
Лейтенант
Сообщения: 221
Зарегистрирован: 08.11.2008

#54 Сообщение 18.09.2010, 23:09

В C++ ты должен сам следить за временем жизни объектов.
char * это указатель. Его задача лишь содержать адрес на строку. Чтобы это стало строкой, соответственно, надо выделить под неё память и поместить адрес в указатель. И потом следить чтобы не выходить за границу выделенной памяти.
char *s = new char[200];
s[0] = 0;
Последний раз редактировалось $t@t!c_V()1D 18.09.2010, 23:09, всего редактировалось 2 раза.
Причина: Подчёркнутое: урок ты так и не извлёк..

Аватара пользователя
GanGSISoft
Полковник
Полковник
Сообщения: 1430
Зарегистрирован: 27.03.2008
Откуда: Бацькаўшчына
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

#55 Сообщение 19.09.2010, 16:37

Lev2008
и так тоже самое.
Эта функция работала в других программах, а вот именно в этой не хочет, такое ощущение, что в процессе работы что-то приводит к нестабильности программы, вообще объявление переменной char *s=new char; в любой функции вставленой в эту программу приводит к вылету.
Ещё закрытие файла тоже стало вылетать с такой ошибкой.

Lev2008
Лейтенант
Лейтенант
Сообщения: 221
Зарегистрирован: 08.11.2008

#56 Сообщение 19.09.2010, 16:54

$t@t!c_V()1D писал(а):Подчёркнутое: урок ты так и не извлёк..
хДДД
Это уже переход на личности, который мне совсем не нужен.

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

GanGSISoft
Давай куски кода побольше. Потому что зачем тебе указатель на единственный символ совершенно непонятно.

Аватара пользователя
GanGSISoft
Полковник
Полковник
Сообщения: 1430
Зарегистрирован: 27.03.2008
Откуда: Бацькаўшчына
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

#57 Сообщение 19.09.2010, 17:04

Код: Выделить всё

#include "stdafx.h"
#include "..\functions.h"

char* RusAnsiiToDos(char *buf)
{
///А -128 Я -97
///а -96 п -81
///р -32 я -17
	char *res=new char;
	memset(res,0,140);
	int l,i;
	l=strlen(buf);
	for(i=0;i<=l;i++){
		if(buf[i]<0){
			res[i]=buf[i]-64;
		}if(buf[i]>'п'){res[i]=buf[i]-16;}
	}
	res[i-1]=0;
	return res;
}

int _tmain(int argc, _TCHAR* argv[])
{
	char *fb2_fn=new char;
	wchar_t *fb2_fn_w=new wchar_t;
	char fn[256]="d:\\temp\\bobik.fb2";

	FILE *fp;
	char *buf=new char;
	char bc=0;
	int i=0;
	int fs;
	printfln("Open File: ",fn,"(y/n)?");
	char ans;
	ans=getchar();
	if(ans=='y'){
	
	fopen_s(&fp,fn,"r");
	if(fp==NULL){printfln("Error: File not Found");}else{
	//Opening file
	fs=_filelength(_fileno(fp));
	while(ftell(fp)<fs-1){
		while(bc!='\n'){
			bc=fgetc(fp);
			buf[i]=bc;
			i++;
		}
		buf[i]='\0';
		if(pos("<first-name>",buf)!=0){fb2_fn=xml_GetParamFromStr("<first-name>",buf);}
		bc=0;
		i=0;
		buf[0]=0;
	}
	fclose(fp);
	size_t* tmp23=new size_t;
	mbstowcs_s(tmp23,fb2_fn_w,40,fb2_fn,255);
	wchar_t *fnw=new wchar_t;
	wchar_t *nfnw=new wchar_t;
	mbstowcs_s(tmp23,fnw,190,fn,255);
	nfnw[0]=0;
	mbstowcs_s(tmp23,nfnw,190,"d:\\temp",255);
	wcscat_s(nfnw,255,L"\\");
	wcscat_s(nfnw,255,fb2_fn_w);
	wcscat_s(nfnw,255,L".fb2");
           MoveFile(fnw,nfnw);
	//printf(RusAnsiiToDos(fb2_fn));
           printf(RusAnsiiToDos("лололо"));//тут должна быть строка что выше, лололо это для теста,
	}
	}
	pause();
	exit(0);
	return 0;
}
Вот весь код. Суть в том что если весь код закоментировать, и оставить тольк строку printf(RusAnsiiToDos("лололо")); то всё рабатает, и если сделать не функцией то всё работает, но если так, то вылетает при объявлении, и не важно есть ли после объявления memset или res[0]=0; До туда оно не доходит

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#58 Сообщение 19.09.2010, 17:37

Lev2008
Если ты не писал ничего сложнее калькулятора, то тебе и не понять разницы. Я тебе сообщаю, что ты отрезаешь нулём в самом начале массива символов, когда это же самое начало скорее всего будет перезаписано. Куда потом твой ноль денется? "Сдвинется"?

GanGSISoft
Б-же, зачем "RusAnsiiToDos" если прога не претендует на кроссплатформенность? Можно в начале программы вставить

Код: Выделить всё

SetConsoleOutputCP(1251);
SetConsoleCP(1251);
и не забыть про <windows.h>
И лучше делать printf("%s", "лололо"); - так МелкоМягкие рекомендуют.

Аватара пользователя
GanGSISoft
Полковник
Полковник
Сообщения: 1430
Зарегистрирован: 27.03.2008
Откуда: Бацькаўшчына
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

#59 Сообщение 19.09.2010, 17:44

$t@t!c_V()1D
Ну тогда другая функция будет глючить
Если у этой функции убрать всё тело оставить, то всё равно вылетает

Код: Выделить всё

   char *res=new char;
   memset(res,0,140);
   res[0]=0;
   return res;
Вот непонятно почему не хочет объявлять в функциях так именно в этой программе

Добавлено спустя 1 минуту 23 секунды:
И как в C присваивать значения "веткам" переменных, вот если есть переменная, а у неё ещё продолжения top, left, вот как top изменить. В Delphi это делается через точку, и как объявлять такие переменные, в pascal это было вида

Код: Выделить всё

var a=record
top:byte;
left:byte;
end;
Последний раз редактировалось GanGSISoft 19.09.2010, 17:43, всего редактировалось 1 раз.

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#60 Сообщение 19.09.2010, 17:53

GanGSISoft писал(а):И как в C присваивать значения "веткам" переменных, вот если есть переменная, а у неё ещё продолжения top, left, вот как top изменить. В Delphi это делается через точку, и как объявлять такие переменные, в pascal это было вида
Если я тебя правильно понял, то это

И ещё мои поздравления, у тебя утечка памяти:
ты объявляешь : char *res=new char;
но не высвобождаешь.

Я сегодня добрый:

Код: Выделить всё

#include "stdafx.h"
#include "..\functions.h"
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    
    char *fb2_fn=new char; //you're allocating a variable, but NOT an array
    wchar_t *fb2_fn_w=new wchar_t;
    char fn[256]="d:\\temp\\bobik.fb2";

    FILE *fp;
    char *buf=new char; //you're allocating a variable, but NOT an array
    char bc=0;
    int i=0;
    int fs;
    printfln("Open File: ",fn,"(y/n)?");
    char ans;
    ans=getchar();
    if(ans=='y')
    {
        //Opening file
        fopen_s(&fp,fn,"r");
        if(fp==NULL)
        {
            printf("Error: File not Found\n");
        
        else
        {    
            fs=_filelength(_fileno(fp));
            while(ftell(fp)<fs-1)
            {
                while(bc!='\n')
                {
                    bc=fgetc(fp);
                    buf[i]=bc;
                    i++;
                }
                buf[i]='\0';
                if(pos("<first-name>",buf)!=0)
                {
                    fb2_fn=xml_GetParamFromStr("<first-name>",buf);
                }
                bc=0;
                i=0;
                buf[0]=0;
            }
            fclose(fp);
            size_t* tmp23=new size_t;
            mbstowcs_s(tmp23,fb2_fn_w,40,fb2_fn,255);
            wchar_t *fnw=new wchar_t;
            wchar_t *nfnw=new wchar_t;
            mbstowcs_s(tmp23,fnw,190,fn,255);
            nfnw[0]=0;
            mbstowcs_s(tmp23,nfnw,190,"d:\\temp",255);
            wcscat_s(nfnw,255,L"\\");
            wcscat_s(nfnw,255,fb2_fn_w);
            wcscat_s(nfnw,255,L".fb2");
            MoveFile(fnw,nfnw);
            printf(RusAnsiiToDos(fb2_fn));
        }
    }
    pause();
    exit(0);
    return 0;
}
Я не знаю, что ты там хотел извлечь, но строки "неопределённых" размеров в Си не создашь. Тебе нужно что-то вроде того:

Код: Выделить всё

   char *bla=new char; // a pointer to 1 char holder variable
   char *res=new char[140]; // a 140-byte array
   memset(res,0,140);
   res[0]=0;
   return res;
Вообще говоря, последний код меня бесит. Его нужно делать в основной функции и подсовывать указатель, чтоб вспомогательная функция заполняла указанное указателем место нужными данными. А потом в основной же функции и высвобождать. Иначе - ура утечкам.

Ответить