473,775 Members | 2,615 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

letter exchange algorithm

16 New Member
Hi,

I came across a neat problem that I have been trying to code to improve my programming problem solving skills. It is quite simple but I am struggling to get my head around it. Any help would be much appreciated.

The problem is the following: a starting word, such as head, is transformed into a second word, such as tail, by way of changing a single letter at a time. All intermediate words must be in the dictionary. The aim is to find the fewest number of intermediate word to perform the transform.

e.g. transform long --> line
long -> lone
lone -> line

So far i copy the start word into a secondary array to manipulate it and place this word at the start of a linked list. Using a function I start with the first letter and loop through all combinations from a-z checking that each is a dictionary word. If it is a word I recursively call the function checking it is not in the list, then add it to the head of the list. I keep recursively changing letters and testing until I find the transformed word.

This method is kind of working, but not really and I think that I am missing something vital. I could do with a few pointers to get me in the right direction. Here is the code I have so far (please ignore the memory leaking :P )

Expand|Select|Wrap|Line Numbers
  1. /*
  2.  * find the shortest path to bread from short changing only one letter
  3.  * at a time
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9.  
  10. struct words_t {
  11.     char word[6];
  12.     struct words_t *next;
  13. };
  14.  
  15. int deep = 0;
  16.  
  17. int shuffle(struct words_t *head, char word[6], char target[6], int lp);
  18. int dict(char word[6]);
  19. int find(struct words_t *head, char word[6]);
  20. int print(struct words_t *head);
  21.  
  22. char previous[BUFSIZ][5];
  23.  
  24. int
  25. main(void) {
  26.     char start[6] = "short", end[6] = "chart";
  27.     struct words_t *words;
  28.  
  29.  
  30.     /* make the first list element the starting point */
  31.     words = malloc(sizeof(words));
  32.     strncpy(words->word, start, 6);
  33.     words->next = NULL;
  34.  
  35.     shuffle(words, start, end, 0);
  36.  
  37.     return 0;
  38. }
  39.  
  40.  
  41. int
  42. shuffle(struct words_t *head, char word[6], char target[6], int lp) {
  43.     int i, letter;
  44.     char this_letter, current[6];
  45.     struct words_t *new;
  46.  
  47.     if(find(head, word) == 1) {
  48.         /* a match was found for this word already */
  49.         return 0;
  50.     }
  51.  
  52.     new = malloc(sizeof(new));
  53.     strncpy(new->word, word, 6);
  54.     strncpy(current, head->word, 6);
  55.     new->next = head;
  56.     head= new;
  57.  
  58.     printf("%d==> %s\n", lp, new->word);
  59.  
  60.     /* loop over all letters */
  61.     for(i=0; i<5; i++) {
  62.  
  63.         /* remember the current letter */
  64.         this_letter = current[i];
  65.  
  66.         /* increment letter */
  67.         for(letter='a'; letter<='z'; ++letter) {
  68.             if(letter == this_letter) ++letter;
  69.             current[i] = letter;
  70.  
  71.             /* have we found a word in the dictionary? */
  72.             if(dict(current)) {
  73.                 if(strncmp(current, target, 5) == 0) {
  74.                     printf("\n\n\tFOUND IT!\n");
  75.                     print(head);
  76.                     exit(0);
  77.                 }
  78.                 shuffle(head, current, target, i);
  79.             } 
  80.         } 
  81.  
  82.         /* 
  83.          * a word was not found with this letter, revert to
  84.          * last word 
  85.          */
  86.         if(((letter-1) == 'z') && (! dict(current))) {
  87.             current[i] = this_letter;                    
  88.         }
  89.     } 
  90. }
  91.  
  92.  
  93. int
  94. find(struct words_t *head, char word[6]) {
  95.     struct words_t *current = head;
  96.  
  97.     while(current->next != NULL) {
  98.         if(strncmp(current->word, word, 5) == 0)
  99.             /* this word has already been used return 1 */
  100.             return 1;
  101.         current = current->next;
  102.     }
  103.     return 0;
  104. }
  105.  
  106.  
  107. int
  108. print(struct words_t *head) {
  109.     struct words_t *current = head;
  110.  
  111.     while(current->next != NULL) {
  112.         printf("<%s> ", current->word);
  113.         current = current->next;
  114.     }
  115.     return 0;
  116. }
  117.  
  118.  
  119. int 
  120. dict(char word[6]) {
  121.     char grep[152];
  122.  
  123.     snprintf(grep, 152, "grep --silent '^%s$' /usr/share/dict/words", word);
  124.  
  125.     /* return 1 if a match is found */
  126.     return !system(grep);
  127. }
  128.  
Jun 29 '10 #1
6 2850
Banfa
9,065 Recognized Expert Moderator Expert
You have an error at line 52

new = malloc(sizeof(n ew));

This allocates 4 bytes to assign to a pointer to a 10 (probably but could be 14) structure. Try this

new = malloc(sizeof *new);

You have the same error at line 27.

You put the first word into the list twice, once at line 32 and once at line 53 on the first iteration. This also means that you have made find ignore the last word in the list when comparing to get round this starting corner case. However on every other iteration this is an error.

Pass an empty list to shuffle on the first iteration, fix find to search all entries.


Line 67

for(letter='a'; letter<='z'; ++letter) {

is platform defined behaviour, the C standard does not guarantee that 'a' + 1 == 'b' it is dependent on the execution character set that the platform uses.

Line 75 - 76

print(head);
exit(0);

Poor practice printing and exiting from the depths of a recursive function call, exit the recursive function to main and print in main. Also you do not release any of your allocated memory, also bad practice.
Jun 29 '10 #2
davidcollins001
16 New Member
Thank you for pointing out the errors, I would have expected to get more errors not allocating memory properly but it seemed to work and is fixed now. Also the head of the list is fixed. I knew about the (extensive) memory leak I will fix that when I understand the algorithm.

About the algorithm, this method I am using seems to work. However, it is slow and won't always find the quickest path unless I search every word in the dictionary, I am just wondering if there is a better approach to it. Does anyone have any ideas I can try? I am not looking for code, just a hand with how best to solve the problem at hand.

Thanks
David
Jun 30 '10 #3
donbock
2,426 Recognized Expert Top Contributor
How many times do you call dict in an average pass? It might be worth the overhead to organize the dictionary into a hash or tree so you can more quickly determine if a letter-pattern is a dictionary word.
Jun 30 '10 #4
Banfa
9,065 Recognized Expert Moderator Expert
Also how big is the dictionary, can you cache some of it in memory?
Jun 30 '10 #5
davidcollins001
16 New Member
I thought about it a bit and changed my algorithm. Now I check every word that is one letter different from the current word instead of following every path to the end. Each letter change is a new level and I move down the level checking all new words against the target. When the target is found this is the shortest path.

I could put the dictionary into a hash and speed it up, but I am more interested in the algorithm.
Thanks :)

Expand|Select|Wrap|Line Numbers
  1.  
  2. /*
  3.  * find the shortest path to bread from short changing only one letter
  4.  * at a time
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10.  
  11. #define WORDSIZ 5
  12.  
  13. struct words_t {
  14.     int level;
  15.     char word[WORDSIZ+1];
  16.     struct words_t *next;
  17. };
  18.  
  19. int shuffle(struct words_t **head, struct words_t *level, char target[WORDSIZ+1], int lp);
  20. int dict(char word[WORDSIZ+1]);
  21. int find(struct words_t *head, char word[WORDSIZ+1]);
  22. int print(struct words_t *head);
  23.  
  24.  
  25. int
  26. main(void) {
  27.     int counter;
  28.     char start[WORDSIZ+1] = "short", end[WORDSIZ+1] = "bread";
  29.     struct words_t *head;
  30.  
  31.     printf("START: %s\tTARGET:%s\n", start, end);
  32.  
  33.  
  34.     head = malloc(sizeof(*head));
  35.     head->level = 0;
  36.     strncpy(head->word, start, WORDSIZ+1);
  37.     head->next = NULL;
  38.  
  39.     counter = shuffle(&head, head, end, 0);
  40.  
  41.     printf("\n\n\tFOUND IT!\n");
  42.     printf("count %d\n", counter);
  43.     print(head);
  44.  
  45.     return 0;
  46. }
  47.  
  48.  
  49. int
  50. shuffle(struct words_t **head, struct words_t *level, char target[WORDSIZ+1], int lp) {
  51.     static int counter = 0;
  52.     int i, j;
  53.     char current[WORDSIZ+1];
  54.     const char alpha[27] = "abcdefghijklmnopqrstuvwxyz";
  55.     struct words_t *currlist = *head;
  56.     struct words_t *nextlist = currlist;
  57.     struct words_t *new;
  58.  
  59.     /* go to the next level of words */
  60.     ++lp;
  61.     printf("level: %d\n", lp);
  62.  
  63.     /* search through current level list of words */
  64.     while((currlist != NULL) && (currlist->level == (lp-1))) {
  65.  
  66.         strncpy(current, currlist->word, WORDSIZ+1);
  67.  
  68.         /* increment letter */
  69.         for(j=0; j<26; ++j) {
  70.  
  71.             /* loop over all letters */
  72.             for(i=0; i<WORDSIZ; i++) {
  73.  
  74.                 /* try next letter */
  75.                 if(alpha[j] == currlist->word[i]) ++i;
  76.                 current[i] = alpha[j];
  77.  
  78.                 /* have we found a word in the dictionary? */
  79.                 if(dict(current)) {
  80.  
  81.                     if(find(*head, current) == 1) {
  82.                         /* a match was found for this word already */
  83.                         break;
  84.                     }
  85.  
  86.                     new = malloc(sizeof(*new));
  87.                     strncpy(new->word, current, WORDSIZ+1);
  88.                     new->next = nextlist;
  89.                     new->level = lp;
  90.                     strncpy(new->word, current, WORDSIZ+1);
  91.                     nextlist = new;
  92.                     *head = nextlist;
  93.  
  94.  
  95.                     /* end recursion here */
  96.                     if(strncmp(current, target, WORDSIZ) == 0) {
  97.                         /* the target word is found */
  98.                         return 1;
  99.                     }
  100.                 } 
  101.  
  102.                 /* 
  103.                  * a word was not found with this letter, revert to
  104.                  * last word 
  105.                  */
  106.                 current[i] = currlist->word[i];
  107.             } 
  108.         } 
  109.         currlist = currlist->next;
  110.     }
  111.  
  112.     /* current word matches the target */
  113.     if((counter = shuffle(head, *head, target, lp))) {
  114.         return ++counter;
  115.     }
  116.  
  117.     /* only unused words reach here and are freed */
  118.     //free(new);
  119.     return 0;
  120. }
  121.  
  122.  
  123. int
  124. find(struct words_t *head, char word[WORDSIZ+1]) {
  125.     struct words_t *current = head;
  126.  
  127.     while(current != NULL) {
  128.         if(strncmp(current->word, word, WORDSIZ) == 0)
  129.             /* this word has already been used return 1 */
  130.             return 1;
  131.         current = current->next;
  132.     }
  133.     return 0;
  134. }
  135.  
  136.  
  137. int
  138. print(struct words_t *head) {
  139.     struct words_t *current = head;
  140.  
  141.     if(current == NULL) return 0;
  142.  
  143.     /* recursively print to get correct order */
  144.     print(current->next);
  145.     printf("<%d:%s> ", current->level, current->word);
  146.  
  147.     return 0;
  148. }
  149.  
  150.  
  151. int 
  152. dict(char word[WORDSIZ+1]) {
  153.     char grep[152];
  154.  
  155.     snprintf(grep, 151, "grep --silent '^%s$' /usr/share/dict/words", word);
  156.  
  157.     /* return 1 if a match is found */
  158.     return !system(grep);
  159. }
  160.  
Jul 1 '10 #6
Plamen Panov
1 New Member
I will describe the algorithm and the computer program in Standard C language to solve this word puzzle.

The goal is to order all the words in the dictionary in a tree like structure starting from the 'start' word .
This will be the trunk of the tree or level 0. Then the program iterates through the dictionary (a linked list of structures) and discovers all words with a single character difference. My procedure compares the words by comparing the characters instead of iterating the alphabet - less expensive. This will be our 1 level of the branches of the tree. Then for each word on level 1 and following levels the program iterates again through the dictionary, discovers words with single character difference and associates them (using C pointers) to the parent word. On the upper branches many words will point to a single parent word. Every time during the iteration the program checks if the targeted word was reached and if so, stops and prints the words in order. Once a word is associated on the tree it will be ignored in following iterations. The reason for ignoring the words already included on the tree is that if we don't it, then logically we are going in circles.

The dictionary is initialized from the beginning in the only linked list used in the program.

The word structure is like this:

struct words_t {
int level;
char word[WORDSIZE+1];
struct words_t *parent;
struct words_t *next;
};

pointer 'next' is for navigating the dictionary and pointer 'parent' is for constructing the tree like structure which will hold the result.

here it is:

NB the dictionary is truncated, but I have attached the full header file here too.







puzzle.h

Expand|Select|Wrap|Line Numbers
  1. #define WORDSIZE 4
  2.  
  3. struct words_t {
  4.      int level;
  5.      char word[WORDSIZE+1];
  6.      struct words_t *parent;
  7.      struct words_t *next;
  8.  };
  9.  
  10. int find(struct words_t *currword, struct words_t *dicstart, struct words_t *target, int level); 
  11. int print(struct words_t *path);
  12.  
  13.  
  14. char *dictionary[] = {
  15. "abet",
  16. "able",
  17. "ably",
  18. "abut",
  19. "aces",
  20. "ache",
  21. "acid",
  22. "acme",
  23. "acne",
  24. "acre",
  25. "acts",
  26. "adds",
  27. "adze",
  28. "aeon",
  29. "afar",
  30. "aged",
  31. ..........
  32. }
  33.  
and

puzzle.c
Expand|Select|Wrap|Line Numbers
  1.  #include <stdio.h>
  2.  #include <stdlib.h>
  3.  #include <string.h>
  4.  #include <ctype.h>
  5.  #include "puzzle.h" 
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.  
  10.      if (( argc != 3 ) || ( strlen(argv[1]) !=4 ) || (strlen(argv[2]) != 4))
  11.            {
  12.                        puts("Usage: puzzle <(4char)From Word> <(4char)To Word>");
  13.                                    return(-1);
  14.            }
  15.  
  16.      char arg1[WORDSIZE+1];
  17.      char arg2[WORDSIZE+1];
  18.      int i;
  19.  //To lower case 
  20.      for (i=0;i<= WORDSIZE;i++){
  21.     arg1[i]=tolower(argv[1][i]);
  22.     arg2[i]=tolower(argv[2][i]);
  23.      }
  24.  
  25.  
  26.      printf("START: %s\tTARGET: %s\n",arg1, arg2);
  27.  
  28.      struct words_t *start = NULL;
  29.      struct words_t *end = NULL;
  30.      struct words_t *dict = NULL;
  31.      struct words_t *new = NULL;
  32.  
  33.  
  34. //Initialize dictionary
  35.  
  36.   i= 0;
  37.   while (i < 1989){
  38.      new = malloc(sizeof(*new));
  39.      new->level = 1000000;
  40.      strncpy(new->word, dictionary[i], WORDSIZE+1);
  41.      new->parent = NULL; //pointer to the root of the treei (initialized as NULL)
  42.      new->next = dict; //pointer to the next word in the dictionary
  43.      dict = new;
  44.      i++;
  45.   }
  46. //My start word goes here and next is the dictionary address: 
  47.      start = malloc(sizeof(*start));
  48.      start->level = 0;
  49.      strncpy(start->word, arg1, WORDSIZE+1);
  50.      start->parent = NULL; //this pointer will remain NULL as it is the root of the tree
  51.      start->next = dict; //pointer to the first word from the dictionary
  52. //The end (target word goes here)    
  53.      end = malloc(sizeof(*end));
  54.      end->level = 1000000;
  55.      strncpy(end->word, arg2, WORDSIZE+1);
  56.      end->parent = NULL;
  57.      end->next = NULL;
  58.  
  59.  
  60.  
  61.      static int levelcounter = 0;
  62.      struct words_t *cmpword = NULL;
  63.  
  64.      for (levelcounter=0;levelcounter<1000; levelcounter++){
  65.     cmpword = start;
  66.     while (cmpword != NULL){
  67.   //printf("\nCHEKPOINT%d\n",cmpword->level);  
  68.       if (cmpword->level == levelcounter){
  69.             if(find(cmpword,start,end,levelcounter+1))
  70.             {
  71.               printf("\n\n\tShortest path found on step:%d\n",levelcounter+1);
  72.               return 0;
  73.             }
  74.           }
  75.     cmpword = cmpword->next;
  76.        }
  77.      }
  78.      printf("\n\n\tPath was not found till step:%d\n",levelcounter);
  79.    return 0;
  80.  }
  81.  
  82.  
  83.  
  84.  int find(struct words_t *currword, struct words_t *dicstart, struct words_t *target, int level) {
  85.  
  86.      struct words_t *dicnext = dicstart->next;
  87.  
  88.     while(dicnext != NULL) {
  89.        //Find a word that is a single character different from the start word and has not been used already
  90.        //Words which have been attached to the tree have level != 1000000
  91.      if ((dicnext->level == 1000000) &&                     
  92.         (((currword->word[0] !=  dicnext->word[0]) && (currword->word[1] ==  dicnext->word[1]) && (currword->word[2] ==  dicnext->word[2]) && (currword->word[3] ==  dicnext->word[3])) ||
  93.         ((currword->word[0] ==  dicnext->word[0]) && (currword->word[1] !=  dicnext->word[1]) && (currword->word[2] ==  dicnext->word[2]) && (currword->word[3] ==  dicnext->word[3])) ||
  94.         ((currword->word[0] ==  dicnext->word[0]) && (currword->word[1] ==  dicnext->word[1]) && (currword->word[2] !=  dicnext->word[2]) && (currword->word[3] ==  dicnext->word[3])) ||
  95.         ((currword->word[0] ==  dicnext->word[0]) && (currword->word[1] ==  dicnext->word[1]) && (currword->word[2] ==  dicnext->word[2]) && (currword->word[3] !=  dicnext->word[3]))))
  96.         {
  97.  
  98.                  //printf("(level:%d %s)\n",level,dicnext->word);
  99.           dicnext->parent = currword; //word with a single char difference is found and attached to the tree     
  100.           dicnext->level = level; //tagging this word with the current level    
  101.  
  102.               //Check if this is our targeted last word
  103.           if(strncmp(dicnext->word, target->word, WORDSIZE) == 0)
  104.               {  
  105.             //if it is the targeted word, print the chain and return 1
  106.             print(dicnext);
  107.             return 1;
  108.               }
  109.            }
  110.  
  111.         dicnext = dicnext->next;
  112.  
  113.      }
  114.      return 0;
  115.  }    
  116.  
  117.  
  118.  
  119.  
  120.  
  121. int  print(struct words_t *path) {
  122.      struct words_t *current = path;
  123.      //struct words_t *prev;
  124.      if(current == NULL) return 0;
  125.      /* recursively print to get correct order */
  126.      print(current->parent);
  127.      printf("<%d:%s>\n", current->level, current->word);
  128.     return 0; 
  129. }
  130.  
  131.  
  132.  




Regards,
Plamen
Attached Files
File Type: txt puzzle.h.txt (1.3 KB, 330 views)
Dec 3 '10 #7

Sign in to post your reply or Sign up for a free account.

Similar topics

0
1021
by: | last post by:
A mail sent by you has been identified as suspicious by MailMonitor for Exchange. Event: infection Action: Message quarantined Message ID: <GANDHSVRIpMozAb6jNo00000095@gandhsvr.GouldHarrison.local> Message subject: Mail System Error - Returned Mail Recipient: "sales@gouldharrison.co.uk" <sales@gouldharrison.co.uk> =============================================================
113
12354
by: Bonj | last post by:
I was in need of an encryption algorithm to the following requirements: 1) Must be capable of encrypting strings to a byte array, and decyrpting back again to the same string 2) Must have the same algorithm work with strings that may or may not be unicode 3) Number of bytes back must either be <= number of _TCHARs in * sizeof(_TCHAR), or the relation between output size and input size can be calculated simply. Has to take into account the...
8
1773
by: Ben Fidge | last post by:
Hi I'm working on a site which requires the users to specify a hotel at which they're staying in London. The complete list of hotels comes to something like 1600 records. Each record consists of Hotel Name, Street Address and Postcode. We need to make it as simple as possible for users to pick their hotel, but I don't want to put 1600 hotel names in a drop-down list, and we have to consider the fact that not every user is going to...
7
4071
by: meenasamy | last post by:
Hi all, i need to create a function that takes three parameters( Original currency, needed currency, amount) i need to convert from the original currency to the needed currency the amount and return the new amount in the needed currency, I need this function to work real time (obtaining real time currency exchange rates), any ideas???
6
1261
by: almurph | last post by:
Hi everyone, I'm looking around for a VB.NET algorithm that can do non-exact matches, that is, a "looks alike" type logic for word patterns. Does anyone have any suggestions/comments/algorthms they would like to mention? Any comments/suggestions greatly appreciated. Al.
2
1757
by: Protoman | last post by:
How would I write a user defnable letter swapping algorithm? I've written an Enigma encrypting program, and I need to redo the plugboard function. Right now, the letter swapping is fixed. I need to allow the user to swap 23 pairs of characters. As you may have guessed, I'm using an alphabet of 36 characters, A-Z and 0-9. Thanks!!!!
15
2137
by: Gigs_ | last post by:
Hi all! I have text file (english-croatian dictionary) with words in it in alphabetical order. This file contains 179999 words in this format: english word: croatian word I want to make instant search for my gui Instant search, i mean that my program search words and show words to user as user type letters.
9
2239
by: Ulterior | last post by:
Hi, everyone, I have a simple problem, which bothers me for some while. I will try to explain it - There is some string, whith different letters in it. Is it possible to analyse this string and the reffer to it knowing that it has some certain letters in it using only some integer value?
6
4092
by: pj | last post by:
Hi, I 'm currently writing a program that performs transliteration (i.e., converts greek text written using the english alphabet to "pure" greek text using the greek alphabet) as part of my thesis. I have decided to add the capability to convert words using some sort of lookup algorithm as a sidekick to the "normal" conversion algorithm, and here it starts getting interesting. I want to find an algorithm that satisfies these...
4
6387
by: kobe67 | last post by:
Create a program that will ask a string from the user, your program should automatically exchange the 1st & the last letter of every word in the string
0
9622
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
9454
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
10268
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10107
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
0
9916
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
1
7464
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
6718
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
5360
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
5486
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.