انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: parsibox در 15 آذر 1388، 07:50 بظ
-
سلام
این فایل های .h چجوری ساخته میشن؟
من یه فایل c++ که مینویستم چجوری باید براش فایل .h بسازم؟
از netbeans استفاده میکنم
-
تا اونجا که یادمه در سی پلاس پلاس، ما دارای یک سری فایل با پسوند h. هستیم که معمولا تعریف کلاسها در این فایلها قرار میگیره و بدنه توابع کلاست در یک فایل مشابه اسم فایل h. با این تفاوت که پسوندش cpp. است، قرار میگیرد. خوب طبیعتا یک فایل main.cpp داری که میتونی اون فایل header رو include کنی و از اون در main شی بسازی و استفاده کنی.
در IDEهای مختلف وقتی یک پروژهٔ جدید درست میکنی بسته به نوع پروژه میتونه یک پروژه GUI باشه که طبیعتا یک سری فایل برای تو درست میکنه یا این که پروژهٔ خالی باشه که باید خودت به پروژت فایل اضافه کنی. اکثر IDEها برای اضافه کردن یک کلاس جدید یک ویزارد دارند که وقتی به وسیله اون ویزارد کلاس درست میکنی دو تا فایل برات درست میکنه که همنام هستند اما با پسوندهای مختلف که یکی h. و دیگری cpp.
طبیعتا در netbeans هم دارای اینچنین فرآیندی هستید.
-
یعنی محتویات داخل فایل .h را خود ide میسازه؟
یا اینکه خودم باید بنویسم؟
اگه باید خودم بنویسم چیا را باید بنویسم؟
توی ide باید چیا بزنم که بسازه؟
-
۱ به نظر من برای شروع برنامه نویسی از netbeans یا eclipse استفاده نکنید و از gedit یا geany استفاده کنید.
۲ netbeans بصورت پیش فرض c++ را support نمیکنه . و باید plug-in رو نصب کنید.
۳ FILE->New File بعد از قسمت سمت راست C++ و از قسمت سمت چپ C++ header File رو انتخاب کن . قسمت بعد هم اسم فایل و محلشو انتخاب می کنید ...
داخل فایل های .h معمولا اعلان تابع ها و کلاس ها نوشته می شود و داخل فایل های .cpp دستورات و کد تابع ها نوشته می شود
برای نمونه
Params.h
#ifndef __PARAMS__
#define __PARAMS__
#include <string>
#include <cstring>
#include <iostream>
#include <cstdlib>
class Params
{
std::string host ;
int port ;
std::string team_name ;
std::string robot_name ;
public :
Params () ;
static Params &instance();
void set_default_params () ;
bool check_params ( int ac , char *av[] ) ;
std::string get_host () ;
int get_port () ;
std::string get_team_name () ;
std::string get_robot_name () ;
};
#endif
Params.cpp
#include "Params.h"
Params::Params()
{
set_default_params () ;
}
Params &Params::instance()
{
static Params param;
return param;
}
void Params::set_default_params ()
{
host = "127.0.0.1" ;
port = 10000 ;
team_name = "RoBoTooS" ;
robot_name = "SaEiD" ;
}
bool Params::check_params ( int ac , char *av[] )
{
for (int i = 1; i < ac; ++i)
{
if (strcmp(av[i], "--team") == 0)
team_name = av[++i];
else if (strcmp(av[i], "--robot") == 0)
robot_name = av[++i];
else if (strcmp(av[i], "--host") == 0)
host = av[++i];
else if (strcmp(av[i], "--port") == 0)
port = atoi(av[++i]);
else
std::cerr << "What?! \"" << av[i] << "\"?!! ;)" << std::endl;
}
return true;
}
std::string Params::get_host ()
{
return host ;
}
int Params::get_port ()
{
return port ;
}
std::string Params::get_team_name ()
{
return team_name ;
}
std::string Params::get_robot_name ()
{
return robot_name ;
}
-
۱ به نظر من برای شروع برنامه نویسی از netbeans یا eclipse استفاده نکنید و از gedit یا geany استفاده کنید.
با کامپایل کردن پروژه در geany مشکل دارم.
نتبینز راحت تر gtk , glade , sqlite ,... را کامپایل میکنه.
۲ netbeans بصورت پیش فرض c++ را support نمیکنه . و باید plug-in رو نصب کنید.
من ورژن فولش را دانلود کردم.همه چیزا ساپورت میکنه.
۳ FILE->New File بعد از قسمت سمت راست C++ و از قسمت سمت چپ C++ header File رو انتخاب کن . قسمت بعد هم اسم فایل و محلشو انتخاب می کنید ...
ممنون اینا تست میکنم.
-
یه سوال دیگه هم داشتم.
کدی نیست که بشه داخل فیلد ها مستقیم خودش فارسی بنویسه؟
الان باید زبان سیستم را تغییر بدم و بزارم روی فارسی تا بتونم فارسی تایپ کنم.
توی c++ کد آماده ای نداریم؟
-
Motvaje manzorton nmisham
( nmidonam chra Farsi m yho ghatide? )sry
-
ببین من یه فرم درست کردم.
یه جا گذاشتم که اسم را وارد میکنند.
وقتی میخوام توی این فرم تایپ کنم در حالت عادی انگلیسی تایپ میشه مگر اینکه زبان سیستم عامل را روی فارسی بزارم تا بتونم توی فیلد اسم فارسی بنویسم.
حالا میخوام ببینم روشی هست که بشه توی این فیلد اسم در حالت عادی فارسی تایپ بشه و نیازی به تغییر زبان سیستم عامل نباشه؟
مثلا برو به این آدرس http://www.parscoders.com/registration
کامل که باز شد جلوی فیلد نام*: را ببین.
میتونی مستقیم توش فارسی تایپ کنی و با دکمه ای که جلوشه میتونی زبان را تغییر بدی.
الان متوجه شدی؟
تو c++ نمیشه این کار را کرد؟
-
۳ FILE->New File بعد از قسمت سمت راست C++ و از قسمت سمت چپ C++ header File رو انتخاب کن . قسمت بعد هم اسم فایل و محلشو انتخاب می کنید ...
ببین اینا تست کردم.
این کار را که بلد بودم.
منظور من را متوجه نشدی.
سوال من این هست: IDE قدرت این را نداره که از روی فایل .cpp من یک فایل .h خودش بسازه؟
اگه میتونه بسازه چجوری باید اینکار را بکنم؟
مثلا شما فایل Params.cpp را به ide بدی و ide خودش برات فایل Params.h را بسازه.
-
فایل cpp. بهش بدی و فایل h. بگیری؟!
دقیقا میخوای چیکار کنی؟
ببین تو ++C کد برنامهها رو با پسوند cpp. ذخیره میکنن و header یا سرفایل کلاسها رو تو یه فایل جدا با پسوند h. ذخیره میکنن که شامل کلاس و پروتو تایپهای توابع عضو میشه و تعریف همه توابع عضو رو تو یه فایل جدا به همون اسم ولی با پسوند cpp. دخیره میکنن. میشه کل یه کلاس رو تو همون فایل main هم نوشت ولی برای پیروی از اصل ADT که تجرد داده بهش میگن سرفایل کلاسها رو جدا مینویسن.
حالا اگه تو یه فایل داری که توش یه کلاس هست میتونی تعریف توابع رو خودت تو یه فایل جدا بذاری. نمونه سینتکسش رو هم دوستمون بالا گذاشته
-
ببین من یه فرم درست کردم.
یه جا گذاشتم که اسم را وارد میکنند.
وقتی میخوام توی این فرم تایپ کنم در حالت عادی انگلیسی تایپ میشه مگر اینکه زبان سیستم عامل را روی فارسی بزارم تا بتونم توی فیلد اسم فارسی بنویسم.
حالا میخوام ببینم روشی هست که بشه توی این فیلد اسم در حالت عادی فارسی تایپ بشه و نیازی به تغییر زبان سیستم عامل نباشه؟
مثلا برو به این آدرس http://www.parscoders.com/registration
کامل که باز شد جلوی فیلد نام*: را ببین.
میتونی مستقیم توش فارسی تایپ کنی و با دکمه ای که جلوشه میتونی زبان را تغییر بدی.
الان متوجه شدی؟
تو c++ نمیشه این کار را کرد؟
در اونجا از جاوااسکریپت استفاده میشه که احتمالا وقتی کد یونیکد (یا شایدم اسکی) انگلیسی رو دریافت میکنه میگه اون رو تبدیل به کد یونیکد فارسی کن بعد اون رو تو textbox نشون بده (در واقع از رخداد presskey استفاده میکنه)
تو این برنامهها هم میشه کاری شبیه به اونجا کرد مثلا وقتی که رخداد presskey اتفاق افتاد کد یونیکد (یا اسکی) انگلیسی رو به یونیکد فارسی تبدیل کرد.
اما به نظرم این کار منظقی نیست چون اگر کسی از زبان دیگری غیر از انگلیسی استفاده کند برنامهٔ شما غیرقابل استفاده میشود.
به نظرم کاربرا باید یاد بگیرند که صفحه کلید رو خودشون تغییر بدند و برنامهنویس هم باید از validate کردن فیلدها استفاده کنه
-
دوست من توی ایران که یا فارسی مینوین یا انگلیسی.
غیر از این ۲ تا که نیست.
در ضمن من طرز عملکرد اون کد را نپرسیدم چون خودم جاوا اسکریپت بلد هستم و میدونم چیکار کردم.
من ۴ سال php کار کردم و کامل برنامه نویسی تحت وب بلد هستم.
من نمیخوام بشینم و چرخ را از اول اختراع کنم.سوال کردم که آیا چنین کدی برای cpp کسی نوشته؟
اگه قبلا نوشتن که منم استفاده کنم ولی اگه ننوشتن بشینم و برای برنامم بنویسم.
===========
فایل .h را هم برای این میخوام :
همون طور که خودت گفتی من کل برنامم را توی ۱ فایل نوشتم ولی حالا میخوام قسمت های مختلف را جدا کنم و فقط در فایل اصلی include کنم.
ولی تا اونجایی که من فهمیدم برای include کردن حتما باید فایل .h بهش بدم و بعد فایل .cpp را خودش باز میکنه.
نمیدونم درست متوجه شدم یا نه.درست فهمیدم؟
حالا میخوام ببینم ide نمیتونه از روی فایل .cpp من یک فایل .h بسازه؟
-
ولی تا اونجایی که من فهمیدم برای include کردن حتما باید فایل .h بهش بدم و بعد فایل .cpp را خودش باز میکنه.
دوست عزیز اشتباه اه عرضتون رسوندن....
هیچ الزامی نیست که حتما فایل .h رو include کنی فایل .cpp رو هم میشه include کرد ...
و هیچ وقت فایل .h اتوماتیک فایل .cpp رو include نمیکنه مگر اینکه خودت بهش گفته باشی ...
حالا میخوام ببینم ide نمیتونه از روی فایل .cpp من یک فایل .h بسازه؟
من که نه همچین چیزی دیدم نه شنیدم ....
فک نکنم 4 خط کد ارزش این کارا رو داشته باشه ... برای هر تابع فقط یک خط ... فک نکنم زحمتی داشته باشه
-
آهان
پس اینا ببین
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <gtk/gtk.h>
#include <glade/glade.h>
#include <sqlite3.h>
#include"tarikh_farsi.h"
من فقط اینا را گذاشتم
و داخل فایل tarikh_farsi.h هم اینا را گذاشتم :
/*
* File: tarikh_farsi.h
* Author: mohsen
*
* Created on December 7, 2009, 2:07 AM
*/
#ifndef _TARIKH_FARSI_H
#define _TARIKH_FARSI_H
#endif /* _TARIKH_FARSI_H */
ولی از تابع تاریخ فارسی که در فایل tarikh_farsi.cpp گذاشتم دارم توی برنامم استفاده میکنم!!!!!
هیچ جای برنامم هم فایل tarikh_farsi.cpp را اینکلود نکردم
یعنی الان چجوری برنامم داره از این فایل استفاده میکنه؟
-
الان شما داخل این فایل tarikh_farsi.h هیچ کار خاصی نکردی ... هیچی
معمولا داخل فایل ها .h کلاس تعریف می کنن و اعلان متد ها (تابع ها ) رو می نویسند اما این فایل .h شما بی مصرف و هیچ کاربردی نداره ...
اصلا هم لازم نیست include کنیش...
اون تابع هم که امکان نداره همچین چیزی ... شما حتما یه جایی یه جوری اون فایلی که تابع داخلش تعریف شده رو include کردی ...
-
من که کل include هایی که کردم را برات گذاشتم
هیچ کار دیگه ای هم نکردم
این فایل.h هم که ساختم همین جور زدم که تست کنم.
ولی وقتی فایل tarikh_farsi.h را اینکلود نکنم کار نمیکنه
-
والا چی بگم ...
من خودم که ۲ ساله c++ زندگیمه تا حالا همچین چیزی ندیده بودم ... و هنوزم از نظر من این غیر ممکنه ...
دیگه نمیدونم ... :-X
این فایل tarikh_farsi.h رو کجا include کردی ؟؟
-
بالای فایل main.cpp
-
یعنی وقتی خط
#include "tarikh_farsi.h"
رو بر میداری error میده ؟؟؟
عجب ??? :o والا تا جایی ک من می دونم این همچین چیزی نمیشه ... حالا شاید بقیه دوستان بدونن چه خبره
-
با چی کامپایلش میکنی؟
ولی وقتی فایل tarikh_farsi.h را اینکلود نکنم کار نمیکنه
کار نمیکنه یعنی چه پیام خطایی میده؟
-
درست شد فهمیدم چیا را باید توی هدر بزارم.
اونایی که توی هدر باید میزاشتم را توی فایل main.cpp گذاشته بودم.
-
main.cpp:182: error: ‘Date’ was not declared in this scope
main.cpp:182: error: expected ‘;’ before ‘a’
main.cpp:183: error: ‘a’ was not declared in this scope
main.cpp:186: error: ‘b’ was not declared in this scope
main.cpp:186: error: ‘gregorian_to_jalali’ was not declared in this scope
-
به نظر من هم بود و نبود فایل tarikh_farsi.h نباید هیچ پیام خطایی بده چون توش هیچی نیست!
فایل main.cpp رو بزاری شاید بشه دید که چیکار کردی، البته اگه open source
-
الان تقریبا میدونم چرا این ارور را میده.
چون توی همون main.cpp هم از یکی از متغیر هایی که در tarikh_farsi.h گذاشتم استفاده کردم.
void on_set_tarikh_clicked ( GtkWidget *widget, gpointer user_data ){
GtkWidget *entry_tarikh;
entry_tarikh = glade_xml_get_widget (gxml_moshtarak, "entry_tarikh");
time_t timestamp;
timestamp = time(NULL);
struct tm *rtime = localtime(×tamp);
Date a,b;
a.dd=rtime->tm_mday;
a.mm=rtime->tm_mon;
a.yy= rtime->tm_year+1900;
b=gregorian_to_jalali(a);
gtk_entry_set_text(GTK_ENTRY(entry_tarikh) , g_strdup_printf("%d - %d - %d", b.yy , b.mm , b.dd ));
}
حالا در نهایت یعنی اصلا نیازی به include کردنم نداره؟
من میتونم بدون include کردن از کدهایی که در یک فایل cpp نوشتم استفاده کنم؟
-
این Date کجا تعریف شده ؟!!
نه دوست عزیز ... کامپایلر بیچاره از کجا بفهمه که شما می خوای از چه فایلی استفاده کنی ؟؟
باید حتما اون فایل .cpp رو که می خوای از محتویاتش استفاده کنی رو include کنی
-
درستش کردم.اینا را منتقل کردم به فایل main.h
دیگه خودم دارم فایل های .h را میسازم.
این ide ها هیچ کاری بلد نیستند انجام بدند!
-
دوست من توی ایران که یا فارسی مینوین یا انگلیسی.
غیر از این ۲ تا که نیست.
در ضمن من طرز عملکرد اون کد را نپرسیدم چون خودم جاوا اسکریپت بلد هستم و میدونم چیکار کردم.
من ۴ سال php کار کردم و کامل برنامه نویسی تحت وب بلد هستم.
من نمیخوام بشینم و چرخ را از اول اختراع کنم.سوال کردم که آیا چنین کدی برای cpp کسی نوشته؟
اگه قبلا نوشتن که منم استفاده کنم ولی اگه ننوشتن بشینم و برای برنامم بنویسم.
===========
فایل .h را هم برای این میخوام :
همون طور که خودت گفتی من کل برنامم را توی ۱ فایل نوشتم ولی حالا میخوام قسمت های مختلف را جدا کنم و فقط در فایل اصلی include کنم.
ولی تا اونجایی که من فهمیدم برای include کردن حتما باید فایل .h بهش بدم و بعد فایل .cpp را خودش باز میکنه.
نمیدونم درست متوجه شدم یا نه.درست فهمیدم؟
حالا میخوام ببینم ide نمیتونه از روی فایل .cpp من یک فایل .h بسازه؟
فکر میکنم یتونی برای جدا کردن تعریفها از بدنهٔ توابع از refactoring استفاده کنی. کار سختی نباید باشه. کسی که ۴ ساله php کار میکنه حتما refactoring رو یاد داره :دی
http://en.wikipedia.org/wiki/Code_refactoring