2011-01-15 40 views
2

我得到了一些C++源代碼,我想將其重寫到Objective C中。如果有人可以爲我寫這個代碼的頭文件,它會幫助我很多。當我得到Headerfile時,我將能夠重寫源代碼的其餘部分。將C++代碼重寫爲Objective C

這將是非常好的,如果有人可以幫助我請。

感謝

我將郵政的源代碼在這裏:

#include <stdlib.h> 
#include <iostream.h> 

#define STATES 5 

int transitionTable[STATES][STATES]; 

// function declarations: 
double randfloat     (void); 
int chooseNextEventFromTable (int current, int table[STATES][STATES]); 
int chooseNextEventFromTransitionTablee (int currentState); 
void setTable     (int value, int table[STATES][STATES]); 


////////////////////////////////////////////////////////////////////////// 

int main(void) { 
    int i; 

    // for demo purposes: 
transitionTable[0][0] = 0; 
transitionTable[0][1] = 20; 
transitionTable[0][2] = 30; 
transitionTable[0][3] = 50; 
transitionTable[0][4] = 0; 
transitionTable[1][0] = 35; 
transitionTable[1][1] = 25; 
transitionTable[1][2] = 20; 
transitionTable[1][3] = 30; 
transitionTable[1][4] = 0; 
transitionTable[2][0] = 70; 
transitionTable[2][1] = 0; 
transitionTable[2][2] = 15; 
transitionTable[2][3] = 0; 
transitionTable[2][4] = 15; 
transitionTable[3][0] = 0; 
transitionTable[3][1] = 25; 
transitionTable[3][2] = 25; 
transitionTable[3][3] = 0; 
transitionTable[3][4] = 50; 
transitionTable[4][0] = 13; 
transitionTable[4][1] = 17; 
transitionTable[4][2] = 22; 
transitionTable[4][3] = 48; 
transitionTable[4][4] = 0; 

    int currentState = 0; 
for (i=0; i<10; i++) { 
    std::cout << currentState << " "; 
     currentState = chooseNextEventFromTransitionTablee(currentState); 
    } 
    return 0; 
}; 


////////////////////////////////////////////////////////////////////////// 


////////////////////////////// 
// 
// chooseNextEventFromTransitionTable -- choose the next note. 
// 

int chooseNextEventFromTransitionTablee(int currentState) { 
int targetSum = 0; 
int sum   = 0; 
int targetNote = 0; 
int totalevents = 0; 
int i; 

currentState = currentState % STATES; // remove any octave value 
for (i=0; i<STATES; i++) { 
    totalevents += transitionTable[currentState][i]; 
} 
targetSum = (int)(randfloat() * totalevents + 0.5); 
while (targetNote < STATES && 
    sum+transitionTable[currentState][targetNote] < targetSum) { 
    sum += transitionTable[currentState][targetNote]; 
    targetNote++; 
} 

return targetNote; 
} 





////////////////////////////// 
// 
// randfloat -- returns a random number between 0.0 and 1.0. 
// 

double randfloat(void) { 
    return (double)rand()/RAND_MAX; 
} 



////////////////////////////// 
// 
// setTable -- set all values in the transition table to the given value. 
// 

void setTable(int value, int table[STATES][STATES]) { 
    int i, j; 
    for (i=0; i<STATES; i++) { 
     for (j=0; j<STATES; j++) { 
     table[i][j] = value; 
     } 
    } 
} 

更新

我不僅編譯頭文件有另一個文件即時編譯過

源代碼:

// 
// markovThreadsChainsViewController.m 
// markovThreadsChains 
// 
// Created by Philippe Mokrzycki on 15.01.11. 
// Copyright 2011 TGM. All rights reserved. 
// 

#import "markovThreadsChainsViewController.h" 
#import "markov.h" 
//#import "markovChainOC.h" 

@implementation markovThreadsChainsViewController 

@synthesize mcValueLabel, threadStartGenerateButton, threadStopGenerateButton; 

- (IBAction) startThreadGen:(UIButton *)sender{ 
    threadStopGenerateButton.hidden=NO; 
    threadStartGenerateButton.hidden=YES; 
    mcValueLabel.text = @"0"; 

    currentState=0; 

// markovChainOC *mCobc = [[markovChainOC alloc]init]; 

// [mCobc setCurrentState:0]; 
    [NSThread detachNewThreadSelector:@selector(startThreading) toTarget:self withObject:nil]; 
} 

- (IBAction) stopThreadGen:(UIButton *)sender{ 
    threadStopGenerateButton.hidden=YES; 
    threadStartGenerateButton.hidden=NO; 
    [NSThread detachNewThreadSelector:@selector(stopThreading) toTarget:self withObject:nil]; 
} 

- (void) startThreading { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 

    [NSThread sleepForTimeInterval:3]; 
    [self performSelectorOnMainThread:@selector(markovGen) withObject:nil waitUntilDone:NO]; 
    [pool release]; 
} 

- (void) stopThreading { 
    [NSThread cancelPreviousPerformRequestsWithTarget:self]; 
} 

- (void)markovGen{ 
    transitionTable[0][0] = 25; 
    transitionTable[0][1] = 25; 
    transitionTable[1][0] = 25; 
    transitionTable[1][1] = 25; 

// int actualValue = [mCobc getCurrentState]; 

    int actualValue = currentState; 
    mcValueLabel.text = [NSString stringWithFormat:@"%", actualValue]; 
    currentState = chooseNextEventFromTransitionTablee(currentState); 
    [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(markovGen) userInfo:nil repeats:NO]; 

} 


/* 
// The designated initializer. Override to perform setup that is required before the view is loaded. 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { 
     // Custom initialization 
    } 
    return self; 
} 
*/ 

/* 
// Implement loadView to create a view hierarchy programmatically, without using a nib. 
- (void)loadView { 
} 
*/ 


/* 
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 
*/ 


/* 
// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 
*/ 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 


- (void)dealloc { 
    [mcValueLabel release]; 
    [threadStartGenerateButton release]; 
    [threadStopGenerateButton release]; 
// [mCobc release]; 
    [super dealloc]; 
} 

@end 
+3

你爲什麼要在ObjC中重寫這段代碼?您可以將編譯目標設置爲「Objective C++」,Xcode將很好地編譯C++代碼。 –

+2

編譯器也會接受C++代碼,不需要在目標C中重寫它。 – KaiserJohaan

+0

感謝您的快速回答,我知道我可以用這種形式編譯它,但我需要在另一個程序中實現這些功能,並且該程序寫在Objective C –

回答

2

只需將這些行放入頭文件中,就可以包含頭文件並從任何其他Objective-C或C源文件中調用函數。

(支持C++也,你可能需要把extern "C" { ... }在他們身邊,除非你正在編譯的一切,C++或Objective-C++)。

#pragma once 

#define STATES 5 

int transitionTable[STATES][STATES]; 

// function declarations: 
double randfloat     (void); 
int chooseNextEventFromTable (int current, int table[STATES][STATES]); 
int chooseNextEventFromTransitionTablee (int currentState); 
void setTable     (int value, int table[STATES][STATES]); 

更多細節:

要使用這些功能從另一個類,你需要在你的項目中的以下文件:

  • markov.h(或任何你決定將它命名),包含上述行。
  • markov.c(或任何你決定將它命名),從原始的源文件,其中包含了其他的東西,除了main功能,您應該刪除

然後,您使用的功能應其他文件有一個#include "markov.h"行,然後你應該能夠打電話給他們。

如果您正在獲取有關缺少函數的鏈接器錯誤,這意味着您沒有編譯markov.c作爲項目的一部分,或者導致某些選項導致函數名稱不正確匹配。

+0

感謝這個工作對我來說,但現在我還有一個問題,當我試圖編譯我的程序,我得到一個錯誤信息: 「_chooseNextEventFromTransitionTablee」,從引用: - [markovThreadsChainsViewController markovGen]在markovThreadsChainsViewController.o中 符號未找到 collect2:ld返回1退出狀態 –

+0

您是否正在編譯原始文件?標題本身是不夠的:您還必須編譯您的原始函數,或者鏈接到包含它們的庫。 –

+0

我正在編譯的不僅是頭文件 我想在另一個類中使用這個函數 –

3

這段代碼根本沒有任何面向對象的東西。只需將iostream.h更改爲stdio.h,然後將cout更改爲printf。那麼這是一個普通的C程序。

+0

好,謝謝,我會嘗試 –