Δημιουργία αρχείων header

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: Super-Moderators, WebDev Moderators

Απάντηση
Erevis
Δημοσιεύσεις: 56
Εγγραφή: 12 Ιουν 2008 16:31
Τοποθεσία: Χαλάνδρι

Δημιουργία αρχείων header

Δημοσίευση από Erevis » 30 Νοέμ 2008 23:59

Καταρχήν χαιρετώ άπαντες...

έχω το εξής πρόβλημα

θέλω τα παρακάτω source files:

Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct node
&#123;
    char name&#91;20&#93;;
    int cCnt;
    int timeSum;
    struct lnode *root;
    struct lnode *current;
    
    struct node *right;
    struct node *left;      
&#125;;

void insertNode&#40;struct node **root,struct node *newNode&#41;;
void display&#40;struct node *p&#41;;
struct node * find&#40;struct node *p,char key&#91;&#93;&#41;;

void insertNode&#40;struct node **root,struct node *newNode&#41;
&#123;
    if&#40;&#40;*root&#41; == NULL&#41;
    &#123;
             *root = newNode;
             return;   
    &#125;
    if&#40;newNode->name < &#40;*root&#41;->name&#41;
    &#123;
             insertNode&#40;&&#40;*root&#41;->left,newNode&#41;;        
    &#125; 
    else
    &#123;
             insertNode&#40;&&#40;*root&#41;->right,newNode&#41;;
    &#125;
&#125;

void display&#40;struct node *p&#41;
&#123;
    if&#40;p->left&#41; display&#40;p->left&#41;;
    printf&#40;"%s\n",p->name&#41;;
    if&#40;p->right&#41; display&#40;p->right&#41;; 
&#125;

struct node * find&#40;struct node *p,char key&#91;&#93;&#41;
&#123;
   struct node *current;
   
   current =  p;   
   
   while&#40;current->name != key&#41;
   &#123;
             if&#40;key < current->name&#41; current = current->left;
             else current = current-> right;
             if&#40;current == NULL&#41; return NULL;          
   &#125;
   return current;
&#125;
και

Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct lNode
&#123;
    char date&#91;10&#93;;
    char time&#91;8&#93;;
    char cTime&#91;8&#93;;
    char terminal&#91;20&#93;;
    
    struct lNode *next;
&#125;;

typedef struct lNode *pList;

void insert&#40;pList *p,char date&#91;&#93;&#41;
&#123;
    pList temp;
    temp = *p;
    *p = &#40;pList&#41; malloc&#40;sizeof&#40;pList&#41;&#41;;
    strcpy&#40;&#40;*p&#41;->date,date&#41;;
    &#40;*p&#41;->next = temp;
    return;
&#125;

void print&#40;pList p&#41;
&#123;
    while &#40;p != NULL&#41;
    &#123;
             printf&#40;"%s\n",p->date&#41;;
             p = p->next;
    &#125; 
    return;
&#125;

int deleteNode&#40;pList *p,char key&#91;&#93;&#41;
&#123;
    pList temp;      
    
    while&#40;&#40;*p&#41; != NULL&#41;
    &#123;
             if&#40;strcmp&#40;&#40;*p&#41;->date,key&#41; == 0&#41;
             &#123;
                       temp = *p;
                       *p = &#40;*p&#41;->next;
                       free&#40;temp&#41;;
                       return 1;                       
             &#125;  
             else
             &#123;
                       p = &&#40;&#40;*p&#41;->next&#41;;
             &#125;

    &#125;
    return 0;
&#125;
να τα κάνω include στο source που είναι η main, μήπως μπορεί να με βοηθήσει κάποιος?
Thanx in advance :D

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Δημιουργία αρχείων header

Δημοσίευση από dva_dev » 01 Δεκ 2008 01:35

Αυτό που πρέπει να κάνεις είναι δύο πράγματα:
1) Να ξεχωρίσεις τις δηλώσεις (μεταβλητών, συναρτήσεων, δομών δεδομένων, ...) από την υλοποίηση βάζοντας τις δηλώσεις σε άλλο αρχείο (.h) από αυτό που έχεις την υλοποίηση (.c ή .cpp)

2) Στα αρχεία που κάνεις την υλοποίηση των συναρτήσεων αλλά και στα αρχεία που θέλεις να χρησιμοποιήσεις δομές δεδομένων ή συναρτήσεις που υλοποιούνται αλλού να κάνεις include το αντίστοιχο header file (.h)

Το πρώτο αρχείο σου θα σπάσει σε header1.h και source1.c (βάλε καλύτερα ονόματα που να δείχνουν ότι υπάρχει σχέση ανάμεσα στα δύο αρχεία π.χ. timetree.h και timetree.c)

Κώδικας: Επιλογή όλων

//header1.h
struct node 
&#123; 
    char name&#91;20&#93;; 
    int cCnt; 
    int timeSum; 
    struct lnode *root; 
    struct lnode *current; 
    
    struct node *right; 
    struct node *left;      
&#125;; 

void insertNode&#40;struct node **root,struct node *newNode&#41;; 
void display&#40;struct node *p&#41;; 
struct node * find&#40;struct node *p,char key&#91;&#93;&#41;;

Κώδικας: Επιλογή όλων

//source1.c
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#include "header1.h" //Κάνει include το header1.h για να ξέρει τις δηλώσεις των functions.

void insertNode&#40;struct node **root,struct node *newNode&#41; 
&#123; 
    if&#40;&#40;*root&#41; == NULL&#41; 
    &#123; 
             *root = newNode; 
             return;    
    &#125; 
    if&#40;newNode->name < &#40;*root&#41;->name&#41; 
    &#123; 
             insertNode&#40;&&#40;*root&#41;->left,newNode&#41;;        
    &#125; 
    else 
    &#123; 
             insertNode&#40;&&#40;*root&#41;->right,newNode&#41;; 
    &#125; 
&#125; 

void display&#40;struct node *p&#41; 
&#123; 
    if&#40;p->left&#41; display&#40;p->left&#41;; 
    printf&#40;"%s\n",p->name&#41;; 
    if&#40;p->right&#41; display&#40;p->right&#41;; 
&#125; 

struct node * find&#40;struct node *p,char key &#91;&#93;&#41;
&#123; 
   struct node *current; 
    
   current =  p;    
    
   while&#40;current->name != key&#41; 
   &#123; 
             if&#40;key < current->name&#41; current = current->left; 
             else current = current-> right; 
             if&#40;current == NULL&#41; return NULL;          
   &#125; 
   return current; 
&#125;
Αντίστοιχα το 2ο αρχείο σου θα σπάσει σε header2.h και source2.c

Κώδικας: Επιλογή όλων

//header2.h
struct lNode
&#123; 
    char date&#91;10&#93;; 
    char time&#91;8&#93;; 
    char cTime&#91;8&#93;; 
    char terminal&#91;20&#93;; 
    
    struct lNode *next; 
&#125;; 

typedef struct lNode *pList; 

void insert&#40;pList *p,char date&#91;&#93;&#41;;
void print&#40;pList p&#41;;
int deleteNode&#40;pList *p,char key&#91;&#93;&#41;;

Κώδικας: Επιλογή όλων

//source2.c
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#include "header2.h"

void insert&#40;pList *p,char date&#91;&#93;&#41; 
&#123; 
    pList temp; 
    temp = *p; 
    *p = &#40;pList&#41; malloc&#40;sizeof&#40;pList&#41;&#41;; 
    strcpy&#40;&#40;*p&#41;->date,date&#41;; 
    &#40;*p&#41;->next = temp; 
    return; 
&#125; 

void print&#40;pList p&#41; 
&#123; 
    while &#40;p != NULL&#41; 
    &#123; 
             printf&#40;"%s\n",p->date&#41;; 
             p = p->next; 
    &#125; 
    return; 
&#125; 

int deleteNode&#40;pList *p,char key&#91;&#93;&#41; 
&#123; 
    pList temp;      
    
    while&#40;&#40;*p&#41; != NULL&#41; 
    &#123; 
             if&#40;strcmp&#40;&#40;*p&#41;->date,key&#41; == 0&#41; 
             &#123; 
                       temp = *p; 
                       *p = &#40;*p&#41;->next; 
                       free&#40;temp&#41;; 
                       return 1;                        
             &#125;  
             else 
             &#123; 
                       p = &&#40;&#40;*p&#41;->next&#41;; 
             &#125; 

    &#125; 
    return 0; 
&#125;
Τώρα το μόνο που μένει είναι να κάνεις include αυτά τα 2 header files στο αρχείο που έχεις την main.

Κώδικας: Επιλογή όλων

//main.c
#include ...

#include "header1.h"
#include "header2.h"

int main&#40;int argc, char** argv&#41;
&#123;
	...

Erevis
Δημοσιεύσεις: 56
Εγγραφή: 12 Ιουν 2008 16:31
Τοποθεσία: Χαλάνδρι

Δημιουργία αρχείων header

Δημοσίευση από Erevis » 01 Δεκ 2008 23:30

Να 'σαι καλά και πάλι :D

alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

Δημιουργία αρχείων header

Δημοσίευση από alex599 » 28 Δεκ 2009 16:45

Λοιπόν, έχω ένα πρόβληματάκι με τα header files. Έχω ένα απλό header alex1.h με τις εξής δηλώσεις:

Κώδικας: Επιλογή όλων

#ifndef ALEX1_H
#define ALEX1_H

class point&#123;
      int x;
      int y;
public&#58;
       point&#40;&#41;;
       point&#40;int ,int &#41;;
       void set_x&#40;int &#41;;
       void set_y&#40;int &#41;;
       int get_x&#40;&#41;;
       int get_y&#40;&#41;;
&#125;;

#endif
και στη συνέχεια δημιουργώ ένα άλλο αρχείο alex1.cpp (πρέπει να το κάνω compile? μου βγάζει πρόβλημα σύνδεσης λόγω μη ύπαρξης main()):

Κώδικας: Επιλογή όλων

#include <iostream>
#include <iomanip>
#include "alex1.h"

using namespace std;

point&#58;&#58;point&#40;&#41;&#123;
   x=0;
   y=0;
&#125;

point&#58;&#58;point&#40;int x,int y&#41;&#123;
   this->x=x;
   this->y=y;
&#125;

void point&#58;&#58;set_x&#40;int x&#41;&#123;
   this->x=x;
   return;
&#125;

void point&#58;&#58;set_y&#40;int y&#41;&#123;
   this->y=y;
&#125;

int point&#58;&#58;get_x&#40;&#41;&#123;
   return x;
&#125;

int point&#58;&#58;get_y&#40;&#41;&#123;
   return y;
&#125;
και στη συνέχεια δημιουργώ το πρόγραμμα μου main.cpp ως εξής:

Κώδικας: Επιλογή όλων

#include <iostream>
#include <iomanip>
#include "alex1.h"

using namespace std;

int main&#40;&#41;&#123;
    point p1;
    point p2&#40;3,4&#41;;
    cout << "&#40;" << p1.get_x&#40;&#41; << "," << p1.get_y&#40;&#41; << "&#41;" << endl;
    cout << "&#40;" << p2.get_x&#40;&#41; << "," << p2.get_y&#40;&#41; << "&#41;" << endl;
    system&#40;"pause"&#41;;
    return 0;
&#125;
και δεν μου κάνει compile!!! μου βγάζει πρόβλημα για: undefined references στις συναρτήσεις μέλη της κλάσης μου.. δηλαδή όπως το βλέπω το πρόβλημα μου είναι στο δεύτερο αρχείο μου. Κάποιος βοήθεια... χρησιμοποιώ dev-cpp.
while(!dead()) ++knowledge;

Erevis
Δημοσιεύσεις: 56
Εγγραφή: 12 Ιουν 2008 16:31
Τοποθεσία: Χαλάνδρι

Δημιουργία αρχείων header

Δημοσίευση από Erevis » 29 Δεκ 2009 00:24

Τα έχεις βάλει στο ίδιο project? Αν όχι, πρέπει να φτιάξεις μόνος σου το makefile.

alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

Δημιουργία αρχείων header

Δημοσίευση από alex599 » 29 Δεκ 2009 12:23

ωραίος..δεν το έκανα σε ίδιο έργο. Να ρωτήσω και κάτι άλλο...για να δημιουργώ σκέτες βιβλιοθήκες θα πρέπει στο ίδιο έργο να προσθέτω και ένα main.cpp που να κάνει κάποια εφαρμογή τους? φαντάζομαι όχι,ε?
while(!dead()) ++knowledge;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Δημιουργία αρχείων header

Δημοσίευση από dva_dev » 29 Δεκ 2009 15:01

Βιβλιοθήκες μπορείς να έχεις 2 ειδών. Τις στατικές (.lib) και τις δυναμικές (.dll - χρειάζονται τη dllmain).
Tη main() την χρειάζεται η εφαρμογή σου (.exe).

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες