2014年9月4日木曜日

iPhoneで「C言語入門」の「Hello Wrold」のプログラム書いてみた

iPhoneでC言語入門などの書籍に出てくるプログラムを作ろうとするとmain関数が隠蔽されていて見えなかったり、printfなどの関数はデバッグ出力には表示されるのですが、液晶画面の方には表示されなかったり。
これでは気軽にprintfデバッグでいろいろなコンソールプログラムやライブラリが作れません。
そこで、iPhone用のmain関数が実行できるソースコードを作ってみました。

どこまでObjective-CでどこからC言語にするか非常に迷います。
あとでもう少しコードを整理しよっと。



-----------
//
//  ViewController.m
//  HelloUITextView
//
//  Created by yomei on 2014/09/04.
//  Copyright (c) 2014 yomei. All rights reserved.
//

#ifdef __APPLE__
#import "ViewController.h"
#endif

#include <stdio.h>

#ifdef __APPLE__
#include <unistd.h>
#endif

#ifdef __APPLE__
#define main mymain
#endif


void mysleep(int s)
{
#ifdef __APPLE__
    sleep(s);
#endif
}

void print(char* str)
{
    if(str==NULL)return;
#ifdef __APPLE__
    [ViewController print:str];
#else
    printf("%s¥n",str);
#endif
}

int main(int argc,char* argv){
    int i;
    char buf[256];
    print("Hello iPhone World!");
    for(i=0;i<3;i++){
        sprintf(buf,"main i=%d",i);
        print(buf);
        mysleep(1);
    }
    return 0;
}



//
// object view
//
#ifdef __APPLE__

static UITextView* s_view=NULL;
static ViewController* s_viewcontroller=NULL;

@interface ViewController ()

@end

@implementation ViewController

- (void) print_uithread:(NSString*) str
{
    if(s_view==NULL)return;
    s_view.text=[s_view.text stringByAppendingFormat:@"%@\n",str ];
}
+ (void) print:(char*) str
{
    printf("%s\n",str);
    if(s_viewcontroller==NULL || str==NULL)return;
    NSString* str2 = [NSString stringWithCString: str encoding:NSUTF8StringEncoding];
    [s_viewcontroller performSelectorOnMainThread:@selector(print_uithread:) withObject:str2 waitUntilDone:NO];
}

- (void) run:(NSString*) val
{
    main(0,NULL);
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGRect rect= self.view.bounds;
    UITextView* textview=[[UITextView alloc]initWithFrame:rect];
    textview.editable=NO;
    textview.font=[UIFont fontWithName:@"Helvetica" size:14];
    textview.backgroundColor=[UIColor blackColor];
    textview.textColor=[UIColor whiteColor];
    
    textview.text=@"";
    textview.text=[textview.text stringByAppendingFormat:@"%s\n","iPhone Console" ];
    textview.text=[textview.text stringByAppendingFormat:@"%s\n","revision 0.01" ];
    textview.text=[textview.text stringByAppendingFormat:@"%s\n","" ];
    
    s_view=textview;
    s_viewcontroller=self;
    
    //thread start
    [self performSelectorInBackground:@selector(run:) withObject:@""];
    
    // add view
    [self.view addSubview:textview];
    
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}
-(void)viewDidUnload
{
    [super viewDidUnload];
    
    s_viewcontroller=NULL;
    s_view=NULL;
}

@end
#endif



--------
//
//  ViewController.h
//  HelloUITextView
//
//  Created by yomei on 2014/09/04.
//  Copyright (c) 2014 yomei. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

+ (void) print: (char*)str;

//@property (weak,nonatomic) IBOutlet UITextView* m_textview;


@end

0 件のコメント:

コメントを投稿